2

我正在学习 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;
}
4

3 回答 3

4

该对象s不会超出第一个for循环的范围。存储它的地址是没有意义的,取消引用它是未定义的行为

于 2013-05-14T18:28:46.943 回答
3

代码具有未定义的行为。您持有本地自动变量的引用。

for(int i = 0; i < 2; i++) {
    Structure s = {i};
    structs[i] = &s;

} // life time of s ends here

由于代码具有 UB,因此所有赌注都已取消。所以,你得到什么输出并不重要。

于 2013-05-14T18:28:47.073 回答
1

唯一在您声明它的Structs s = {i};for 循环中具有范围。一旦你离开那个循环,它就不再存在,即使你仍然有一个指向它的指针。之后都是未定义的行为。

于 2013-05-14T18:29:16.160 回答