davidmou 发表于 2023-10-13 08:09:02

自動變量

#include <string.h>
#include <stdio.h>
int main()
{
    while(3)
    {
    auto int b= 1;
    int *a;
    a = &b;
    printf("\n%d",a);

    }

}

剛進入while的第一次循環,創建自動變量int b ,執行到代碼塊結尾時會銷毀int b ,那再進入while 循環時優惠創建新的自動變量int b,如此來説每一次創建的自動變量b 應有不同的地址,但爲什麽輸出結果都相同,都是6422036

isdkz 发表于 2023-10-13 08:09:19

在这段代码中,每次循环都会创建一个新的自动变量b,但是每次创建的变量b的地址并不一定相同。因为自动变量是在栈上分配的,而栈的分配方式是先进后出,也就是说每次创建的b变量的地址可能会与上一次创建的b变量的地址相同,因为上一次创建的b变量可能还没有被完全释放。

此外,你在输出a的时候应该输出a所指向的变量的值,而不是a本身的地址。因此,你需要修改printf语句为:

printf("\n%d",*a);

陶远航 发表于 2023-10-13 08:09:50

在C語言中,自動變量(auto variable)是在函數或塊內部聲明的變量,它們在每次函數或塊調用時都會被創建,並在函數或塊結束時被銷毀。然而,這並不意味著每次創建的變量都會在不同的內存地址。實際上,編譯器可能會重複使用相同的內存地址來存儲新的自動變量。

在你的代碼中,每次while循環時,變量b都會被創建並分配一個內存地址,然後在循環結束時被銷毀。然而,當下一次循環開始時,編譯器可能會再次選擇相同的內存地址來存儲新的b變量。這就是為什麼你看到的輸出結果都是相同的內存地址。

這種行為並不是C語言的規定,而是由具體的編譯器和運行時環境決定的。在某些情況下,你可能會看到每次創建的自動變量有不同的內存地址,但在其他情況下,你可能會看到相同的地址被重複使用。

另外,你的代碼中有一個小錯誤。你應該使用%p格式符來打印指針的值(即內存地址),而不是%d。所以,你應該將printf語句改為`printf(\"\
%p\", a);`。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-13 08:10:08

问题分析:

在C语言中,auto关键字用于声明自动变量,该变量的生命周期仅限于所在代码块。每次循环迭代时,变量会重新创建,并具有不同的内存地址。然而,观察到的输出结果都是相同的地址值,这可能是由于编译器的优化导致的。

修改建议:

为了确保每次迭代都创建新的自动变量并查看其地址,请在循环内使用另一个变量来存储地址,并输出该变量的值。


#include <string.h>
#include <stdio.h>

int main() {
    int i = 0;
    while(i < 3) {
      auto int b = 1;
      int *a;
      a = &b;
      printf("\n%d", *a);
      
      int *addr = &b;
      printf("\nAddress: %p", addr);

      i++;
    }

    return 0;
}


这样,您将能够在每次循环迭代时查看自动变量b的地址。

运行示例:

输入:


输出:

1
Address: 0x7fff9f5986cc
1
Address: 0x7fff9f5986cc
1
Address: 0x7fff9f5986cc


注意到每次迭代中自动变量的地址都相同,这是由于编译器将其优化为只创建一个变量并重复使用。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 自動變量