这个问题在这里已经有了答案:
For-loop Local Variables in C
(4 个回答)
How to prevent compiler from using the same address for a variable in a loop
(1 个回答)
How to printf a memory address in C
(2 个回答)
去年关闭。
考虑下面的 C 代码。我会认为变量 bar
每次都被实例化,因此会指向内存中的不同地址,但事实并非如此。
for (i = 2; i < 7; i++) {
struct foo bar;
printf("struct %u\n", bar);
}
输出:
struct 13205520
struct 13205520
struct 13205520
struct 13205520
struct 13205520
如果不明显,我想要的是生成 5 个不同的
struct
s—嗯,实际上 5 个不同的指针指向 struct
s——在 5 个不同的位置。我怎样才能做到这一点?
最佳答案
bar
范围只存在于循环的一次迭代中。这意味着当下一个 struct foo
创建后,会和旧的 bar
放在同一个地方,因为在编译器看来,bar
不再需要。看看你的例子,你似乎不需要处理所有的 bar
马上了。所以你可能会同意他们都在同一个位置。但是,如果您需要一次处理多个,我可以想到两种可能的解决方案。
将范围置于循环之外
为此,您需要一组 struct foo
的。数组的范围需要在循环之外。例如:
struct foo bar_list[5];
for (i = 2; i < 7; i++) {
printf("struct %p\n", (void *)&bar_list[i - 2]);
// use the foo's here
}
然后 for 循环的每次迭代都可以修改其中一个值
在堆上分配
如果您可以在内存中存储五个指针,则可以将每个条形分配到堆上的某个位置。无论如何,您最终可能只会使用数组,因此这可能仅在您需要将结构返回到另一个函数时才有用。你需要做这样的事情:
struct foo* bar_list[5];
for (i = 2; i < 7; i++) {
bar_list[i - 2] = malloc(sizeof(struct foo));
printf("struct %p\n", (void *)bar_list[i - 2]);
// do anything else you need to do
}
还值得一提的是,正如其他人指出的那样,
%p
将用于打印指针地址。
关于c - 为什么这个循环中的变量指向同一个内存位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61580303/