#include <stdio.h> int *p = NULL; void fun() { int i = 10; p = &i; } void main() { fun(); printf("第1次:*p = %d\n", *p); printf("第2次:*p = %d\n", *p); printf("第3次:*p = %d\n", *p); }
求楼上那些说是无聊问题的大神讲解上述现象的原因 要是讲不出来就别装逼了,人家问个问题看把你急的,又没浪费你生命,觉得浪费生命就别回啊,最看不惯这种人
[quote=引用 16 楼 worldy 的回复:] print参数是传值不是传指针,你把值当指针,得到的数是随机数,弄不好可能程序还会崩溃(访问越界)
没执行,不过应该全是10吧,执行fun的时候变量i的内存位置应该跟*p这个形参压进去的位置相同。 执行sleep会变化是因为sleep也是一个函数调用,会压栈,把原来内存位置的东西改写。 debug和release不同是因为,debug版本会加入一些调试信息。 至于gcc,配置一下应该也可以去掉debug信息生成一个release版的
如果是单线程程序,第一个应该是10,但第二开始应该就不会是10了,而是int类型的随机值了!! 因为保存在栈空间的临时变量i的内存空间已经被重新写如新的数值了! 这个p地址 其实保存了一个栈空间的一个内存地址 这个地址的内容是随时被写人被赋值的 printf后 这个内存地址的内容就被重新写了
print参数是传值不是传指针,你把值当指针,得到的数是随机数,弄不好可能程序还会崩溃(访问越界)
这里提出这个问题是想让大家分析出现这样结果的原因,借此探究程序堆、栈内存的分配、使用以及回收规则,从而帮助提升代码执行效率。不喜欢这种问题的朋友看看就好。
65,186
社区成员
250,526
社区内容
加载中
试试用AI创作助手写篇文章吧