我正在学习C并遇到结构问题。
我们假设我有以下结构:
typedef struct {
int x;
} Structure;
int main (void) {
Structure *structs[2];
for(int i = 0; i < 2; i++) {
Structure s = {i};
structs[i] = &s;
}
for(int i = 0; i < 2; i++) {
printf("%d\n", structs[i]->x);
}
return 1;
}
输出结果为:
1
1
我不明白为什么新结构会覆盖旧结构。
这可能是一个愚蠢的问题。但是我没理解。
谢谢!
解决:
typedef struct {
int x;
} Structure;
int main (void) {
Structure *structs[2];
for(int i = 0; i < 2; i++) {
Structure *s = (Structure *)malloc(sizeof(Structure));
s->x = i;
structs[i] = s;
}
for(int i = 0; i < 2; i++) {
printf("%d\n", structs[i]->x);
free(structs[i]);
}
return 1;
}
答案 0 :(得分:4)
对象s
不会超出第一个for
循环的范围。存储其地址毫无意义,取消引用它是未定义的行为。
答案 1 :(得分:3)
代码具有未定义的行为。您持有本地自动变量的引用。
for(int i = 0; i < 2; i++) {
Structure s = {i};
structs[i] = &s;
} // life time of s ends here
由于代码有UB,所有投注均已关闭。所以,你得到的输出并不重要。
答案 2 :(得分:1)
Structs s = {i};
仅在您声明它的for循环中具有范围。一旦你离开那个循环,它就不再存在,即使你仍然有一个指向它的指针。在此之后,这都是未定义的行为。