C-堆栈变量在迭代之间消失

C- stack variable disappearing between iterations

您好,我是 C 语言的新手,花了太长时间才找到这个错误。这是发生的事情的示例:

#include <stdio.h>


struct Garbage {
  int value;
};

int main(int argc, char *argv[]) {
  int i = 0;
  struct Garbage* pointers[10];
  while (i < 10) {
    struct Garbage temp = { .value = i * 7 };
    pointers[i] = &temp;
    i++;
  }

  for (int i = 0; i < 10; i++) {
    printf("pointers[%d]->value %d\n", i, pointers[i]->value);
  }
}

为什么会这样打印

pointers[:]->value: [63, 63, 63, 63, 63, 63, 63, 63, 63, 63, ]

我认为这是因为在 while 循环的每次迭代中,temp 都被放置在堆栈中的相同位置。但它为什么要这样做呢?为什么 C 认为它可以破坏我的变量? 这里发生的事情有名字吗?我试图找到相关信息,但无法找到。所以如果你告诉我这叫什么,我就可以自己搜索一下。非常感谢!

您没有正确分配 temp

struct Garbage* pointers[10];
while (i < 10) {
    struct Garbage temp = { .value = i * 7 };
    pointers[i] = &temp;
    i++;
}

一旦 struct Garbage temp 超出范围(或者实际上每次迭代结束后),您将不再拥有指针指向的任何内存。访问该内存是未定义的行为。

可能发生的情况是,为每个 struct Garbage temp 创建的对象分配同一个堆栈 space,因此您的所有指针可能都指向相同的内存地址。您可以使用 printf("%p\n", pointers[i]) 验证这一点(所有指针都相同)。

解决此问题的一种方法是使用 malloc

struct Garbage* pointers[10];
while (i < 10) {
    pointers[i] = malloc(sizeof(struct Garbage));
    pointers[i]->value = i * 7;
    i++;
}

请记住 free 完成所有这些指示后。