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
完成所有这些指示后。
您好,我是 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
完成所有这些指示后。