C语言疑惑的地方

qq_39545013 2017-07-26 04:10:01
int *name()
{
int *s=5;
return s;
}
main()
{
int *a=name();
printf("%d\n",s);
}

为什么输出还是5,*s不应该是在栈区的吗,函数结束后,内存就没了呀。
...全文
414 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jena_wy 2017-07-28
  • 打赏
  • 举报
回复
5是一个常量,所以返回的是5这个常量的指针,常量指针不会变,所以可以输出5
赵4老师 2017-07-27
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
不懂啊不懂 2017-07-27
  • 打赏
  • 举报
回复
引用 楼主 qq_39545013 的回复:
int *name()
{
 int  *s=5;     //这步会出错,将int型赋给int* 类型,要强转,不然编译不通过
 return s;
}
main()
{
 int *a=name();
 printf("%d\n",s);
}
为什么输出还是5,*s不应该是在栈区的吗,函数结束后,内存就没了呀。
其它没毛病
不懂啊不懂 2017-07-27
  • 打赏
  • 举报
回复
虽然是在堆栈中,堆栈是没有了,但是指针绝对在(也就是内存地址是不会跟着堆栈消失的),里面的数据你没有清空,内存中就会一直保存。 如果你的s是一个基本变量,这样就行不通了。
自信男孩 2017-07-27
  • 打赏
  • 举报
回复
先不辨别楼主的问题,首先,你的程序肯定是有问题的,编译都通不过吧。怎么会有正确值呢。 修改如下:
int *name()
{
 int  *s=5;
 return s;
}
main()
{
 int *a=name();
 printf("%d\n", a);
}
然后,讨论这个问题; name函数中,s是指针,将5赋值给s就是,s指针变量里存放的值是5,即s指针指向内存单元中地址为5单元(可能是虚拟地址)。然后将s返回(返回的是s内存单元里的值5)。main函数中将该值又赋值给变量a,然后输出变量a的值。这样没什么问题。跟栈有关系的就是变量s, a但是return返回的是值。
战在春秋 2017-07-26
  • 打赏
  • 举报
回复
引用
内存就没了
int *name()
{
 int  *s=5; //这行会报错,等式左右两边类型不符
 return s;
}
main()
{
 int *a=name();
 printf("%d\n",s); //这行会报错,s在main函数中没有定义。
}
代码是有问题的,不知道是不是粘贴错了,请再检查一下。
真相重于对错 2017-07-26
  • 打赏
  • 举报
回复
如果真确,也是偶然
qq_29648169 2017-07-26
  • 打赏
  • 举报
回复
这个代码好奇怪哦,能通过编译吗?
虾米小小小 2017-07-26
  • 打赏
  • 举报
回复
main函数里哪来的s,直接就报错不运行的......
zaixiankaifa 2017-07-26
  • 打赏
  • 举报
回复
直接就在 int * s =5 就报错了
jianyue--- 2017-07-26
  • 打赏
  • 举报
回复
int *name() { int *s=5;/////////// 编译能过吗 return s; } main() { int *a=name(); printf("%d\n",s); ///////////// s哪来的 } 这样的代码还能运行,深表怀疑,能编译成功吗
冬南风 2017-07-26
  • 打赏
  • 举报
回复
这种方式是很危险的,int *s=5; 准确来说这个会crash的。 刚好返回的这个指针指向内存能访问,所以某次是没有问题。 还有你确定main里面的printf是没打错?
开心秋水 2017-07-26
  • 打赏
  • 举报
回复
你是直接向指针赋值一个整数,然后指针又向指针赋值,所以指针a的值当然就是5啦
qq_39545013 2017-07-26
  • 打赏
  • 举报
回复
兄弟们解释一下

69,373

社区成员

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

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