c - 为什么编译器在重新定义变量后会为同一个变量分配不同的内存地址?

标签 c memory scope shadowing

代码如下:

#include <stdio.h>
int main()
{
    int i;
    printf("%p\n",&i);
    for (i = 0; i < 5; i++)
    {
        int i = 10;
        printf("%d %p\n", i,&i);
        i++;
    }
    return 0;
}

首先我们定义了一个变量i (就在主要之后)。然后在 for 的开头循环我们定义了相同的变量i再次。所以,里面 for循环,i 的值是 10。 for循环必须只迭代一次,因为 i>5第一次迭代后。但令我惊讶的是输出如下:

0x7ffe8b799da0
10 0x7ffe8b799da4
10 0x7ffe8b799da4
10 0x7ffe8b799da4
10 0x7ffe8b799da4
10 0x7ffe8b799da4

我的问题是:
1)为什么编译器考虑初始定义的变量i在执行 i<5;i++ 时指令,而不是重新定义的变量 i ? (第一次迭代后)。

2) 为什么编译器将不同的内存地址分配给相同的变量标识符 i

最佳答案

Why is the compiler considering the initial defined variable i while executing i<5;i++ instruction and, not the re-defined variable i? (after first iteration).

因为重新定义的(阴影)变量还不在范围内。如果删除第一个定义,则会出现“标识符未声明”错误。这在循环的第一次迭代后也不会改变,因为它是在编译时确定的。

2) Why did compiler assign different memory address to same variable identifier i?

即使您无法访问外部 int i在循环内部,作为第二个阴影,它仍然存在,因此需要自己的内存。它没有被另一个覆盖 int i .您可以通过放置 printf("%d\n", i); 来查看循环后 - 它将打印 5 ,因为那是 i 的值(value)循环后。


另一方面,i++;在循环结束时没有效果,因为它影响了 i在循环内,在 i++; 之后超出范围.这不同于 i++;for (i = 0; i < 5; i++) ,这增加了外部i .

关于c - 为什么编译器在重新定义变量后会为同一个变量分配不同的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58298020/

相关文章:

c - Visual Studio 2010 C++ 意外的命令行参数

c - 如何在C中使用数组将字符串存储在堆栈中?

您可以在 C 头文件中将 typedef 的变量重新转换为另一种类型吗?

java - OrientDB 2.2.*+ Embedded Recommended 32-bit/x86 Configuration/JVM 参数

VB.NET For 循环函数作用域与 block 作用域

lua - 为 Lua 声明变量和范围问题

ios - 在 Objective-C 中创建仅对子类可见的属性

c - 将 strlen 与 scanf(%ms) 结合使用

c - C 语言中未声明的实体如何管理内存?

c# - 获取内存中托管对象的 'optimistic' 大小