【问题标题】:why variable address not change - c programming为什么变量地址不变-c编程
【发布时间】:2020-06-23 22:46:20
【问题描述】:

我在 for 循环的每次迭代中声明了一个变量 x。为什么x的地址不变?

int main(void) {
  for (int i = 0; i < 5; i++) {
    int x = i;
    printf("x = %d", x);
    printf(" &x = %d", &x);
    printf("\n");
  }
  return EXIT_SUCCESS;
}
output

x = 0 &x = 1508435624                                                                      
x = 1 &x = 1508435624                                                                      
x = 2 &x = 1508435624                                                                      
x = 3 &x = 1508435624                                                                      
x = 4 &x = 1508435624    

如果我想要一个指向int的指针数组int ** arr,是否需要单独初始化变量,因为地址在for循环中不会改变,比如


int num0 = 0;
int num1 = 1;
int num2 = 2;

int * arr[] = {&num0, &num1, &num2};

有没有更简单的方法来完成这项任务?

谢谢!

【问题讨论】:

  • 更简单的方法是声明一个int 的数组。然后你的指针数组可以指向ints 数组的元素。但不清楚为什么需要一个指针数组。你可能想edit这个问题来解释一下。
  • x 在堆栈上声明,因此它可能会在每次迭代时重用相同的内存......你为什么希望它移动?
  • 你每周为周日晚餐切蔬菜。令人惊讶的是,你总是在厨房里的同一个砧板上做这件事,每次都放在几乎完全相同的地方。我要说明的是,编译器(无论是链接器)没有理由在内存的不同部分创建该临时局部变量,因为情况 8 包括其他局部临时变量的数量和大小)总是相同的.

标签: c


【解决方案1】:

局部变量不需要在每次实例化时都具有不同(或相同)的地址。

不管怎样,如果您打算在循环结束时保存该变量的地址,您将遇到undefined behavior,因为您的指针将指向不再使用的内存。

您需要为每个数组成员动态分配内存,以使它们不同,并避免创建单独的变量。

【讨论】:

    【解决方案2】:

    如果不查看生成的汇编代码,我无法确定,但我猜想在每次迭代中,int x 变量使用堆栈顶部的地址,然后在结束时被丢弃迭代,以便下一次迭代使用相同的内存地址。

    要获得指向整数的指针数组,您只需声明它:

    int *arr[NUM_INTS];
    

    然后您可以使用 arr[0] 等引用单个 int 指针。

    【讨论】:

      【解决方案3】:

      也许你的编译器决定优化你的代码,或者是因为它每次都分配在堆栈顶部并且堆栈并没有真正移动,所以它每次都获得相同的堆栈地址,但我们不能确定没有看到您的程序集,如果您想了解更多信息,可以查看Stack-based memory allocation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多