鱼C论坛

 找回密码
 立即注册
查看: 818|回复: 3

[已解决]自動變量

[复制链接]
发表于 2023-10-13 08:09:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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
最佳答案
2023-10-13 08:09:50
在C語言中,自動變量(auto variable)是在函數或塊內部聲明的變量,它們在每次函數或塊調用時都會被創建,並在函數或塊結束時被銷毀。然而,這並不意味著每次創建的變量都會在不同的內存地址。實際上,編譯器可能會重複使用相同的內存地址來存儲新的自動變量。

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

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

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

使用道具 举报

发表于 2023-10-13 08:09:19 | 显示全部楼层
在这段代码中,每次循环都会创建一个新的自动变量b,但是每次创建的变量b的地址并不一定相同。因为自动变量是在栈上分配的,而栈的分配方式是先进后出,也就是说每次创建的b变量的地址可能会与上一次创建的b变量的地址相同,因为上一次创建的b变量可能还没有被完全释放。

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

printf("\n%d",*a);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-13 08:09:50 | 显示全部楼层    本楼为最佳答案   
在C語言中,自動變量(auto variable)是在函數或塊內部聲明的變量,它們在每次函數或塊調用時都會被創建,並在函數或塊結束時被銷毀。然而,這並不意味著每次創建的變量都會在不同的內存地址。實際上,編譯器可能會重複使用相同的內存地址來存儲新的自動變量。

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

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

另外,你的代碼中有一個小錯誤。你應該使用%p格式符來打印指針的值(即內存地址),而不是%d。所以,你應該將printf語句改為`printf(\"\
%p\", a);`。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-13 08:10:08 | 显示全部楼层
问题分析:

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

修改建议:

为了确保每次迭代都创建新的自动变量并查看其地址,请在循环内使用另一个变量来存储地址,并输出该变量的值。
  1. #include <string.h>
  2. #include <stdio.h>
  3. int main() {
  4.     int i = 0;
  5.     while(i < 3) {
  6.         auto int b = 1;
  7.         int *a;
  8.         a = &b;
  9.         printf("\n%d", *a);
  10.         
  11.         int *addr = &b;
  12.         printf("\nAddress: %p", addr);
  13.         i++;
  14.     }
  15.     return 0;
  16. }
复制代码

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

运行示例:

输入:


输出:
[/code]
1
Address: 0x7fff9f5986cc
1
Address: 0x7fff9f5986cc
1
Address: 0x7fff9f5986cc
[/code]

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

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 07:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表