在c中的循环中创建结构体变量

标签 c for-loop struct scope reference

我正在尝试在 C 中创建一堆结构变量。 假设我有一个 for 循环,它运行 3 次并创建三个结构变量。 我的问题是,为什么它要创建引用同一内存位置的变量。 代码:

struct arrIndexStruct {
    int *arr;
    int index;
};


int main() {
    int i;
    for (i=0; i<3; i++) {
        struct arrIndexStruct arrayIndexStruct;
        arrayIndexStruct.arr = someArray;
        arrayIndexStruct.index = i;
        printf("%p\n",(void *)&arrayIndexStruct);
    }
}

我得到的输出是:

0x7ffeed84f690
0x7ffeed84f690
0x7ffeed84f690

如果我这样做

struct arrIndexStruct arrayIndexStruct1;
struct arrIndexStruct arrayIndexStruct2;
printf("%p\n",(void *)&arrayIndexStruct1);
printf("%p\n",(void *)&arrayIndexStruct2);

我会得到

0x7ffc484e64d0
0x7ffc484e64e0

这两种行为有什么区别,for 循环不应该具有局部作用域吗? 谢谢!

最佳答案

该变量仅在代码中首次出现后定义,直到其封闭 block 结束为止。当它到达作用域末尾时,其原始内存可以用于其他用途。

特别是在循环中,变量始终占据相同的位置,因为这是编译器可以实现的最简单的事情。

第二种情况完全不同,因为第一个变量在引入第二个变量时保持定义。您可以在以下示例中获得相同的地址,但这取决于编译器以及调试级别、优化等:

{
    struct arrIndexStruct arrayIndexStruct1;
}
{
    struct arrIndexStruct arrayIndexStruct2;
}

关于在c中的循环中创建结构体变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39802127/

相关文章:

c - 如何将 typedef 结构用于 FIFO?

c - 在哪里可以开始使用 C 语言进行 Unicode 友好的编程?

c - 是否有一个属性告诉编译器忽略缺少的 return 语句?

java - 用 Java 制作动画

javascript - JavaScript 中的 While 循环与 For 循环?

struct - 如何以编程方式获取结构的字段数?

c# - 使 StructLayout 在类上工作,就像它在结构上工作一样

c - 我需要帮助编写对数组进行冒泡排序的代码

c - 如何使用多个 pthreads 来评估程序中的表达式

c - 如何使用 C 中的 for 循环检查数组中的所有元素是否等于特定数字