面试题目:请问运行下面的程序会出现什么结果:
char* getMemory()
{
char a[] = "hello,world";
return a;
}
int main(int argc, char **argv)
{
char *str = NULL;
str = getMemory();
printf("%s\n", str);
return 0;
}
我乍一看,直接写下结果:hello,world
面试官问你确定没问题吗?我信心十足,没问题。他说:你错了,这个结果不对,让我再考虑一下。我又看了一遍,还是说没问题。后面我问他,他说这个程序应该运行起来会崩溃,因为getMemory返回的指针指向的内存为栈内存,会被释放掉。我争论说:没有吧,明明指向的是常量字符串,怎么可能会被释放掉呢?他很无赖,说让我回去试一下,后来我回去的路上想了很久,这明明是指向的常量字符串内存,后来再一回想,发现不对,a貌似是一个数组指针。哎,明白了,我错将a看成了普通指针。如果程序改成这样就没有问题了:
char* getMemory()
{
char *p = "hello,world";
return p;
}
都是眼神太快惹的祸啊,当时还暂金截铁的跟面试官争论,原来是我的错,尴尬啊。
char a[] = "hello,world";
这一句会在栈上分配一个12个字节的数组空间(是12个吧,我没数错把,年纪大了伤不起),然后将常量字符串的内容拷贝过来,所以这与char *p = "hello,world"是有区别的,可以打印a的地址和p的地址,发现跟本就不一样,这么简单的问题,居然搞错了,愧对人类啊。记录一下,当笑话看吧。