程序设计面试题(1) - C/C++局部字符串变量
问题:
#include<iostream>
char *GetMemory(void)
{
char p[]="hello world";
return p;
}
int main()
{
char *str=NULL;
str=GetMemory();
cout<<str<<endl;
return 0;
}
解答:
这段程序输出是乱码. 但是如果把char p[] = "hello world"; 改成 char *p = "hello world";就能输出正确了. 一般在C中我们习惯于把数组变量和指针变量声明等同的使用.但是其中还是有一些区别的. 这里的原因是:
事实上无论哪种情况"hello world"在编译时已经放在read only data段里面了
char *p的声明只是产生了一个指向这个data段数据的指针;但是后果是你不能通过p来修
改这个字符串.
char p []的声明是产生一个栈上char数组, 而数组的内容在运行时从data段copy而来,
所以可以通过p修改这个copy来的字符串;但后果是它会随着栈帧的消亡而消亡, 并且有
产生overflow的隐患.
浙公网安备 33010602011771号