gpt4 book ai didi

c - 了解结构中的指针行为

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:15 25 4
gpt4 key购买 nike

我定义了一个具有单个字段和初始化函数的结构,如下所示:

typedef struct{
int* field;
}myStruct;
myStruct init(int x){
myStruct s;
s.field = &x;
return s;
}

然后我声明其中两个结构,然后打印第一个的字段。

int main(){
myStruct s1 = init(1);
myStruct s2 = init(2);
printf("s1.field=%d\n",*s1.field);
return 0;
}

结果是“s1.field=2”。为什么第二个的初始化会影响第一个?

最佳答案

你调用了这个函数两次:

myStruct init(int x){
myStruct s;
s.field = &x;
return s;
}

在这两个调用中,变量(或参数)x 被分配,但在函数返回时不再有效。您已经存储了一个局部变量的地址,并且由于您使用的是相同的函数,所以局部变量地址第二次是相同的,这解释了“魔法”(这仍然是未定义的行为 但大多数对自动变量使用堆栈的编译器会产生相同的结果)

不幸的是,编译器不够智能,无法检测到您正在存储局部变量的地址。当您返回本地地址(更容易检测)时,它们通常会触发警告。

例如,如果您调用 printf,您将得到的不是 1 或 2,而是完整的垃圾,因为参数内存的组织方式与您的函数不同。

一个干净的方法是分配动态内存:

s.field = malloc(sizeof(*s.field));  // this memory persists even after the end of "init"
*s.field = x; // copying the value, not the address

当然在不使用结构时需要释放。

关于c - 了解结构中的指针行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51714618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com