gpt4 book ai didi

c - 为什么这个循环中的变量指向同一个内存位置?

转载 作者:行者123 更新时间:2023-12-03 14:35:32 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com