C++学习笔记(9)----关于变量和数组大小的一道容易出错的面试题

一道容易出错的C++笔试题

求下面代码的输出内容:

int main(int argc,char* argv[])
{
	char str1[]="Hello";
	char* str2="World";
	cout<<sizeof(str1)<<endl
		<<sizeof(str2)<<endl;
	return 0;
)

解析:

str1指向的是字符串 "Hello" 的首地址,但 str1 同时也是一个字符数组的首地址,而这个字符数组包含了字符串 "Hello" 末尾的 '\0',所以 sizeof(str1) 的值为 strlen(str1)+1 , 为6。
有人就会自然而然地认为 sizeof(str2)= strlen(str2)+1,认为结果为6。 输出应为:

6
6

其实不然。
str1 代表了一个字符数组的首地址,但是,str1 并非一个变量,甚至可以认为它是一个宏,代表了 ['H','e','l','l','o','\0'] 这个字符数组的地址。或者说 str1 就是一个立即数,而不是一个左值。
而 str2 则是一个 (char*) 型的变量,是一个左值。 目前在32位和64位系统中,在Visual Studio 中测试,只有 double 和 long long 型的变量是 8 个字节的,其它的基本类型变量的大小都是在 4 个及以下字节的,包括各类指针。所以,sizeof(str2) 的值为 4。
上面代码的正确输出为:

6
4
posted @ 2016-09-21 18:08  HorseShoe2016  阅读(229)  评论(0编辑  收藏  举报