C-为什么在循环中创建的变量具有相同的内存地址?

问题描述 投票:0回答:3

只是我的问题的一个简单示例:

while(condition){
    int number = 0;
    printf("%p", &number);
}

该变量将始终位于相同的内存地址中。为什么?

然后在循环内还是循环外声明它的真正区别是什么?

每次迭代我都需要malloc变量以获得不同的地址吗?

c memory memory-address
3个回答
3
投票

该变量将始终位于相同的内存地址中。为什么?

不是必需的,但是您的代码是如此简单,以至于它可能会在所有平台上使用。具体来说,因为它存储在堆栈中,所以相对于堆栈指针,它始终位于同一位置。请记住,您不是在这里分配内存(没有newmalloc),您只是在命名现有的(相对于堆栈的)内存。

然后在循环内还是循环外声明它的真正区别是什么?

在这种情况下,范围。变量不在括号所在的位置。在变量之外,如果另一个变量适合内存,并且编译器选择执行此操作,则可以替换该变量。


1
投票

该变量将始终位于相同的内存地址中。为什么?

编译器决定应该在哪里给变量赋予SO约束,将变量保持在相同的地址然后在每次迭代中都将其重新放置更为有效。

然后在循环内还是循环外声明它的真正区别是什么?

不同之处在于变量的作用域,它只会存在于循环内部,您不能在外部访问,它会在循环退出时超出作用域。

我是否需要在每次迭代中分配变量以获取不同的地址?

malloc是一个昂贵的操作,在每次迭代时都没有必要对变量进行malloc分配,也就是说,再次,编译器决定了为其分配内存的位置,它很可能位于相同的地址,区别在于,内存的类型将位于堆而不是堆栈中。


0
投票

将其放入相同的内存地址以节省内存。

在循环内和不循环内声明它的唯一真正区别是,如果在循环内声明该变量,则该变量将不再在循环外的范围内。

您每次必须使用malloc获取不同的地址。同样,您必须离开free直到所有malloc都获得此保证。

© www.soinside.com 2019 - 2024. All rights reserved.