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

面试题目:请问运行下面的程序会出现什么结果:

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的地址,发现跟本就不一样,这么简单的问题,居然搞错了,愧对人类啊。记录一下,当笑话看吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值