鱼C论坛

 找回密码
 立即注册
查看: 3952|回复: 11

求解小甲鱼老师 --- 一道简单的C问题

[复制链接]
发表于 2012-8-27 15:28:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

char *fun(void)
{
        char p[] = "hello, world";
        return p;
}

void main()
{
        char *p_ch = NULL;
        p_ch = fun();
        printf(p_ch);
}

这输出是什么或着有什么问题没有 ?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-27 16:18:11 | 显示全部楼层
printf("%s",p_ch);
这样试试
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-27 16:42:26 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-27 16:43:18 | 显示全部楼层
守夜人 发表于 2012-8-27 16:18
printf("%s",p_ch);
这样试试

不过还是要谢谢你 !{:2_31:}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-27 16:48:50 | 显示全部楼层
最好别返回指针,你的char p[] = "hello, world";返回给p_ch,看似没问题,但是函数是生命周期的,一旦返回,就意味着char p[] = "hello, world";这段内存是不被保护的,随时有可能被其它数据覆盖掉,所以有时候返回单个字符你可能会幸运地得到一个正确的值,但是字符串就很有可能被长江后浪推前浪,前浪光荣地被覆盖在沙滩上。就这么简单。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-27 16:54:51 | 显示全部楼层
394428311 发表于 2012-8-27 16:48
最好别返回指针,你的char p[] = "hello, world";返回给p_ch,看似没问题,但是函数是生命周期的,一旦返回 ...

关于函数中的变量生命周期 求详解 ~~ 谢啦
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-27 17:12:56 | 显示全部楼层
一朵时光_bobo 发表于 2012-8-27 16:42
好像不是这个原因诶 ~ 刚试了下  =(

我这里输出正常啊
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-27 17:33:23 | 显示全部楼层
一朵时光_bobo 发表于 2012-8-27 16:54
关于函数中的变量生命周期 求详解 ~~ 谢啦

这个。。。就是函数执行完成,跳到下一个函数之后,上一个函数中所有的变量所占的内存都被释放,随时都可能被覆盖,这就是为什么main函数里面有int a,fun函数里面也可以有int a,因为它们都是独立的,一旦fun函数执行完毕,fun所占的内存就可以被其它函数所用。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-27 17:39:48 | 显示全部楼层
394428311 发表于 2012-8-27 17:33
这个。。。就是函数执行完成,跳到下一个函数之后,上一个函数中所有的变量所占的内存都被释放,随时都可 ...

那为什么换成 char *p="hello,world";就可以了
绝不是存心刁难啊 ~ 谢了
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-27 17:42:35 | 显示全部楼层
394428311 发表于 2012-8-27 17:33
这个。。。就是函数执行完成,跳到下一个函数之后,上一个函数中所有的变量所占的内存都被释放,随时都可 ...

局部变量存放内存栈区 函数调用前后入、出栈 。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-27 18:27:09 | 显示全部楼层
一朵时光_bobo 发表于 2012-8-27 17:39
那为什么换成 char *p="hello,world";就可以了
绝不是存心刁难啊 ~ 谢了

p[]是在运行时附识赋值的,*p是在编译时就有的,前者是运行时申请的运行内存,而后者是存储在常量区,只读,不能为written(写),而且*p申请的内存直到程序结束才会被释放,你不信试一下,p[3]="abc",*p="xyz",为什么*p可以给p[3]赋值,而p[3]就不能给*p赋值,这一点在小甲鱼的视频里已经说得很明白,鱼c空间也有。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-27 19:44:59 | 显示全部楼层
394428311 发表于 2012-8-27 18:27
p[]是在运行时附识赋值的,*p是在编译时就有的,前者是运行时申请的运行内存,而后者是存储在常量区,只读 ...

好 说的很对 !THX ! {:2_31:}
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-14 20:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表