中易网

c语言生存期问题

答案:3  悬赏:10  
解决时间 2021-03-06 18:09
第一种:
#include<stdio.h>
void f()
{
int a=3,*p=NULL, c;
if(3==a)
{
int b=5;
p=&b;
}
c=10000;
printf("%d\n",*p);
}
int main()
{
f();
return 0;
}
结果为5;

第二种:
#include<stdio.h>
void f()
{
int a=3,*p=NULL, c=10000;
if(3==a)
{
int b=5;
p=&b;
}
printf("%d\n",*p);
}
int main()
{
f();
return 0;
}
结果为5;
第三种:
#include<stdio.h>
void f()
{
int a=3,*p=NULL;
if(3==a)
{
int b=5;
p=&b;
}
int c=10000;
printf("%d\n",*p);
}
int main()
{
f();
return 0;
}
为什么 第三种 此时的结果为10000,和c的值一样了呢?
我还想问一下这个string 问题:

#include<stdio.h>
int main()
{
char *str="Hello world";
str[0]='h';
printf("%s\n",str);
return 0;
}
为什么输出有问题呀?
最佳答案
其实这3种情况变量b,也就是p所指向的对象都已经被释放了,前两次*p=5的原因是b的内存虽然被释放了,但是还没有被别的对象占用,也就是系统还没有把那块内存拿来给其他东西使用,而系统在释放掉内存后是不会改变它的值的,这样才能保证系统的运行速度,所以你*p的值还是5,但已经是不安全的使用了..而第三次你在定义int c的时候恰巧编译器又把b释放掉的内存分配给了c,所以*p的值变成10000了,但是你是不能保证编译器每次都会把b释放掉的内存分配给c的,所以这也是不安全的,你在不同的编译器上或者不同的时间多运行几次,*p得出的结果说不定都会不一样的....

补充的问题:
当你采用
char *str="Hello world";
这种的方式来对字符串指针进行分配的时候,它的动作是:
1.对"Hello world"开一段只读的内存
2.把"Hello world"的首地址,即'H'所在的地址赋给了字符串指针str
所以你是不能改变指针str所指向的内容的值的,这段内存是给系统自行维护自行释放的.... 所以当你运行它的时候它会告诉你你访问内存出错,这段内存只能为read
全部回答
不在
函数内的变量(auto类型)都是在栈(stack)里分配的,你可以想象运行到函数体内时有一个栈指针SP。先看第一种情况, int a=3,*p=NULL, c; 它会在地址SP, SP-4, SP-8分别为变量a,p,c分配32-bit内存,其中a,p有初始化值。接下来: if(3==a) { int b=5; p=&b; } 又会分配SP-12给b, 此时p就指向了SP-12,最后也没变,虽然它其实已经被“释放”了,但没有被分配给其它变量。 第二种情况和第一种没区别,只是c开始分配SP-8时初始化了值。 第三种情况int b=5;时c还没有分配,因此SP-8被分给了b: if(3==a) { int b=5; p=&b; } p就等于SP-8, 运行结束时SP-8被"释放"了。然后下面的int c=10000;又把SP-8重新分配给了c,由于p保持为SP-8不变,最后打印的*p也就变成了c的值。 补充的问题中的代码应该输出"hello world",第一个'H'变成了小写。我不知道你说的输出有问题是指什么,也许是编译选项的问题。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
"特别鸣谢"用英文怎么说
岳阳弘毅中学和岳阳市十二中学哪个教学质量好
骆屋街/G324(路口)这个地址在什么地方,我要
为什么普通车就有碰撞试验,而像超级跑车布加
一年级语文下册练习题种太阳怎么写
遵义茅栗至漩塘公路动工了吗?
牙龈一直出血 上下两排牙齿还疼的很是为啥
我画了一张画用来当我弟弟【二年级】的暑假作
魔兽争霸3ORPG怎么修改装备啊
盛发五金这个地址在什么地方,我要处理点事
农药残留检测结果数值都是0.000
现在魔域烧钱吗?
荔枝沟梅红日杂五金商行在哪里啊,我有事要去
魔兽地图选人有亡灵法师盗贼战士圣骑士等进去
产生cin最主要因素是什么
推荐资讯
人生苍苍为何渺茫下一句我该说什么
3毫米板用多大二保焊机合适
自制珍珠粉面膜后皮肤很干很粗糙怎么办
淄博张店地区有没有卖碳晶电热板的啊
维他♡命对应的情侣网名是什么?
四季宾馆(北京东路辅路)地址在什么地方,想过
战争雷霆虎式坦克的弱点在哪?是不是虎式正面
益津书院怎么去啊,有知道地址的么
煤气管道铁管和饮用自来水铁管一样的吗?
为什么三原色能组成别的颜色 其他颜色不能组
贾平凹有写过山狗这本书吗?
PROE画复杂的图的时候卡
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?