第一种:
#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;
}
为什么输出有问题呀?
c语言生存期问题
答案:3 悬赏:10
解决时间 2021-03-06 18:09
- 提问者网友:北故人
- 2021-03-06 04:20
最佳答案
- 二级知识专家网友:懂得ㄋ、沉默
- 2021-03-06 04:41
其实这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
补充的问题:
当你采用
char *str="Hello world";
这种的方式来对字符串指针进行分配的时候,它的动作是:
1.对"Hello world"开一段只读的内存
2.把"Hello world"的首地址,即'H'所在的地址赋给了字符串指针str
所以你是不能改变指针str所指向的内容的值的,这段内存是给系统自行维护自行释放的.... 所以当你运行它的时候它会告诉你你访问内存出错,这段内存只能为read
全部回答
- 1楼网友:蜜罐小熊
- 2021-03-06 07:07
不在
- 2楼网友:初心未变
- 2021-03-06 06:21
函数内的变量(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'变成了小写。我不知道你说的输出有问题是指什么,也许是编译选项的问题。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯