关于函数里没有初始化自动变量的问题

qinghu120 2011-04-24 09:10:33
首先,个人编写 如下程序:
int main(void)
{
int i=546;

printf("%d\n", i);

printf("%d\n", &i); //1245052

return 0;
}

使用了 这个内存:1245052, 存储着 一个整数 546.

然后 又注释掉这段程序,更改如下:

int main(void)
{
/*
int i=546;

printf("%d\n", i);

printf("%d\n", &i); //1245052
*/

int k; // k 不进行初始化

printf("%d\n", k);

printf("%d\n", &k); //1245052 同样是使用了这个刚才的内存

return 0;
}

为什么输出结果,不是之前 内存里存储的 546 整数啊?

不是说:没有初始化的变量,则输出之前的存储的数值吗?

请教 各位高手,说说下你们的理解。


...全文
298 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
aa_niaofang 2011-04-25
  • 打赏
  • 举报
回复
大部分编译器直接优化 没有初始化的所有int 都是0
lr2131 2011-04-25
  • 打赏
  • 举报
回复
两个程序中的int型变量绝对是用的同一个地址吗,虽然你在程序中打印了它们的地址且一样,但或许它们是做过了地址映射在你看来是同一个地址,但它们却是在不同的物理地址上。
赵4老师 2011-04-25
  • 打赏
  • 举报
回复
《程序员的自我修养——链接、装载与库》

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
魔笛手 2011-04-24
  • 打赏
  • 举报
回复
LZ 你还没有搞清楚程序运行的过程变量的存储是怎么样!程序一结束全部在栈里的东西都会被清掉。
你第二次用同一个内存但不会有同一个结果的
s20072 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qinghu120 的回复:]
1 楼的说法:" 两次程序运行~ 使用的内存~ 很低可能是同一块地址~ " 对吗?

为什么我 通过查看 k变量的内存地址,跟 之前 i 变量的内存地址,都是一样的啊,所以系统自动分配的内存地址都是同一块的地址的啊。
[/Quote]
我试了一下好像也是。但是程序结束运行以后,这块内存就被归还回内存池里可能被做了其他事。
[/Quote]
还有: 如果 一块内存不再使用了而且也被释放了,这内存的数据都被清除掉, 是吗?
[/Quote]
应该数据没有清除储存的数据吧。每次Watch可以看到,某个变量声明之后没初始化都是垃圾值,说明内存释放的时候只是把它那块内存归还到内存池,然后你要内存的时候计算机只是随便从内存池中取一块和你变量长度相同的,它里面原来装着什么根本不知道。
svtanto 2011-04-24
  • 打赏
  • 举报
回复
局部变量永远在栈上分配,打印出的地址是虚拟地址。
第一次运行结束以后,栈变量都被回收了,所谓回收只是修改了ESP,栈的内容是在的,但是作为一个系统,你的程序停止运行以后,系统还是有些事情要做的,可能在做这些事情时会覆写刚才的栈内容。并且,第二次运行时候虽然是同一个虚拟地址,但是一般来说没有映射到同一个物理内存地址。
南气子水 2011-04-24
  • 打赏
  • 举报
回复
1楼说的好~
pathuang68 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 happymawolf 的回复:]

声明在函数内部的变量,编译器会自动给予分配固定栈空间来存储,所以同是main函数,其第一个内部变量的地址是一样的!
[/Quote]

楼主可以参考这个说法,在做几个实验验证一下。
qinghu120 2011-04-24
  • 打赏
  • 举报
回复
1 楼的说法:" 两次程序运行~ 使用的内存~ 很低可能是同一块地址~ " 对吗?

为什么我 通过查看 k变量的内存地址,跟 之前 i 变量的内存地址,都是一样的啊,所以系统自动分配的内存地址都是同一块的地址的啊。

还有: 如果 一块内存不再使用了而且也被释放了,这内存的数据都被清除掉, 是吗?
书虫 2011-04-24
  • 打赏
  • 举报
回复
声明在函数内部的变量,编译器会自动给予分配固定栈空间来存储,所以同是main函数,其第一个内部变量的地址是一样的!
陈思有 2011-04-24
  • 打赏
  • 举报
回复
就像楼上说的那样,你不能保证原先的那个内存还是存那个数。你不可能知道那个地址的数据什么时候改变
無_1024 2011-04-24
  • 打赏
  • 举报
回复
当你不用的内存在程序结束以后就自动回收了
KID_coder 2011-04-24
  • 打赏
  • 举报
回复
lz的想法太单纯了~

两次程序运行~ 使用的内存~ 很低可能是同一块地址~
计算机一秒钟上亿次的计算~ 当你程序退出~不用这块内存之后~
计算机在里面做了什么动作你不清楚~ 又怎么确保能保留某个地址上一次的值

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧