【问题标题】:passing pointer to static struct object将指针传递给静态结构对象
【发布时间】:2013-08-29 04:24:25
【问题描述】:

我正在尝试通过将静态结构对象的指针传递给另一个函数并通过其中的指针对其进行修改来修改它。 但即使在执行修改函数后,结构体的值也是完整的。

void some_functon_a(....)
{
    static struct some_struct obj;
    modifier_function_b(&obj);
    // obj is not modified as expected in fact not at all
}

void modifier_function_b(struct some_struct *ptr)
{
    // modifying the struct using ptr 
}

此外,当我在此代码上运行 gdb 时,我看到代码流一进入 modifier_function_b() 函数 gdb 就会报告变量 ptr 的两个条目:ptr 和 ptr@entry。所有的修改都在 ptr 上完成,而指向 obj 真实位置的 ptr@entry 没有被修改。有人可以指出这里可能发生的事情吗?指向静态变量的指针是 const 指针,我们不能在它们的范围之外修改它们吗?

还有一件事......如果我删除静态限定符,则不会看到这种行为,这让我认为指向静态的指针是一种 const 指针。

提前谢谢:)

【问题讨论】:

  • modifier_function-b 中的代码到底是什么?编译结束后,Const'ness 会丢失,因此不会发生“不,不要让它改变”。
  • 我猜你的修改代码是错误的,因为我刚刚写了一些与你的描述相对应的东西,它没有出现这个问题。请参阅下面的答案。
  • 另外,你为什么期望指针改变?
  • 等等,你不是想直接分配给 ptr 是吗?像 ptr = malloc(...) 什么的。这永远不会起作用,因为 modifier_function_b 中的 ptr 是本地副本(请记住,c 总是按值传递)

标签: pointers static struct pass-by-pointer


【解决方案1】:

该程序按预期运行。它打印出 1 2 然后 5 6。此外,您没有指定语言,但这在 C 和 C++ 中都是预期的

#include <stdio.h>

struct bar {
    int i;
    int j;
};

void b(struct bar * foo) {
    foo->i = 5;
    foo->j = 6;
}

void aa(){
    static struct bar a;
    a.i = 1;
    a.j=2;
    printf("%d %d\n", a.i, a.j);
    b(&a);
    printf("%d %d\n", a.i, a.j);
}


int main(){
    aa();

}

【讨论】:

  • 感谢您的快速回复。这当然不是实际的代码......这只是我认为与问题相关的部分。现在,如果我运行代码并且不使用 gdb 调试,我会看到使用 printk 语句时代码的行为符合预期,但是当我尝试使用 gdb 进行单步调试时,它的行为与原始问题中提到的一样。这是否意味着我不应该总是信任调试器?
  • 是的...在这种情况下会有什么影响吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2013-01-31
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多