您的位置:首页 > 职场人生

面试小记:关于数组和指针的一个笑话

2015-03-19 16:56 399 查看
面试题目:请问运行下面的程序会出现什么结果:

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的地址,发现跟本就不一样,这么简单的问题,居然搞错了,愧对人类啊。记录一下,当笑话看吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: