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

标签 c pointers

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





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/

相关文章:

c++ - 指针问题将其作为常量发送

c++ - 反向链接列表时,析构函数中的内存错误

java - 应用程序子类的空指针异常

python - 将带有指针数组的不同 "C"函数作为函数参数传递给类

c - 从 C 语言的文件中一次读取一个字符串

c - 如果我使用 mmap 而不是 malloc 分配内存会怎样?

c# - 如何从 C# 访问 .h 文件信息

c - 一种仅在 C 中执行一次代码的更简洁的方法?

c - 将指针传递给指针数组作为参数

在 C 中比较字符串 - strcmp