有趣的笔试题(关于C语言字符数组和字符指针)

关于C语言字符数组和字符指针为什么程序1中的更改能够成功,程序2中的会报错呢?程序1:char*getMem(void){charp[]="HelloWorld";*(p... 关于C语言字符数组和字符指针
为什么程序1中的更改能够成功,程序2中的会报错呢?
程序1:
char* getMem(void)

{
char p[] = "Hello World";
*(p+1) ='a' ;
return p;
}
程序2:
char* getMem(void)
{
char *p = "Hello World";
*(p+1) ='a' ;
return p;
}
展开
 我来答
cdyzxy
2014-04-21 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:85%
帮助的人:3783万
展开全部
这两个都存在错误
先说不报错的情况:第1个程序开设了长度为12的数组,并且在进入函数时初始化成了那个字符串。这时修改这个数组是ok的,但返回的指针的前提是被废弃的p数组内容还没被别的函数冲掉。一般不要返回函数自己定义的变量地址、数组,可以返回它们的值(只能一个),否则这个数组会在函数结束运行时被舍弃,普通这个数组可以从调用者那里申请并将指针传进来。
程序2错误的原因是,p只是一个指针变量,它没有空间来存储字符串,p被赋值成字符串首地址,但这个字符串是位于整个程序的常量区(例1在函数初始化时有个将常量区字符串复制到数组p的过程),而常量区是受保护的,只读,试图改变p指针指向的内容时会报错,这个错就是试图修改常量类型的数据。而这个程序返回的p值,因为是指向常量区的,调用者是可以使用的,这个区域不存在失效问题。
追问
调用函数1是没问题的, 返回的p也能够正确赋值,请问你说的”p数组内容被别的函数冲掉“是什么情况?谢谢
追答
可以试试:在返回p之后,你随便多调用几次printf输出字符串(这些printf会使用你的堆栈工作,它们的数据会冲掉你函数定义而后来被舍弃的数据),然后再用p来看是否有问题,这有个运气问题。
chenfenggang99
2014-04-21 · TA获得超过1850个赞
知道大有可为答主
回答量:1746
采纳率:75%
帮助的人:1752万
展开全部
因为第二个的指针只是在函数里有效,跳出 函数是,自动销毁,所以不会返回
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式