有人可以向我解释为什么以下代码的输出是 6 而不是 5 吗?我不明白调用 hoo 是如何改变 m->x 的值的。 即使在运行代码并按照它的每一步进行操作之后,我仍然不清楚。
#include <stdio.h>
#include <stdlib.h>
typedef struct a {
int x;
struct a* next;
}a_t;
a_t* foo() {
a_t* varp, var = { 5,NULL };
varp = &var;
return varp;
}
a_t* hoo() {
a_t* varp, var = { 6,NULL };
varp = &var;
return varp;
}
void main()
{
a_t* m = foo();
hoo();
printf("%d", m->x);
}
最佳答案
您的函数 hoo
和 foo
正在返回指向局部变量的指针,这根据定义是 *undefined behavior`。
它们都实现了不同的结构(2 个副本),您正在打印第一个的值。
自从您第一次使用函数 foo
在堆栈上创建结构以来,您很幸运,函数 hoo
也在同一位置在堆栈上创建了函数。
因此你有覆盖。
如果您想从函数返回指针,请使用 static
或使用 malloc
在堆上动态分配内存。
a_t* foo() {
a_t* varp = malloc(sizeof(*varp));
varp->m = 5;
return varp;
}
void main()
{
a_t* m = foo();
hoo();
printf("%d", m->x);
free(m);
}
现在您在堆栈外分配内存,它将按您预期的那样工作。
关于c - 结构和指针。不清楚的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45118575/