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

关于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;
}

这两个都存在错误
先说不报错的情况:第1个程序开设了长度为12的数组,并且在进入函数时初始化成了那个字符串。这时修改这个数组是ok的,但返回的指针的前提是被废弃的p数组内容还没被别的函数冲掉。一般不要返回函数自己定义的变量地址、数组,可以返回它们的值(只能一个),否则这个数组会在函数结束运行时被舍弃,普通这个数组可以从调用者那里申请并将指针传进来。
程序2错误的原因是,p只是一个指针变量,它没有空间来存储字符串,p被赋值成字符串首地址,但这个字符串是位于整个程序的常量区(例1在函数初始化时有个将常量区字符串复制到数组p的过程),而常量区是受保护的,只读,试图改变p指针指向的内容时会报错,这个错就是试图修改常量类型的数据。而这个程序返回的p值,因为是指向常量区的,调用者是可以使用的,这个区域不存在失效问题。追问

调用函数1是没问题的, 返回的p也能够正确赋值,请问你说的”p数组内容被别的函数冲掉“是什么情况?谢谢

追答

可以试试:在返回p之后,你随便多调用几次printf输出字符串(这些printf会使用你的堆栈工作,它们的数据会冲掉你函数定义而后来被舍弃的数据),然后再用p来看是否有问题,这有个运气问题。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-21
因为第二个的指针只是在函数里有效,跳出 函数是,自动销毁,所以不会返回