C++学习笔记(9)----关于变量和数组大小的一道容易出错的面试题
2016-09-21 18:08
375 查看
一道容易出错的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
相关文章推荐
- 一道关于返回指针和返回数组名的面试题
- 一道面试题: C能申请的最大全局数组大小?
- 关于数组指针的一道面试题
- 一道关于php变量引用的面试题
- C语言中const分析(未知大小的全局变量数组声明出错)
- 一道关于返回指针和返回数组名的面试题
- 一道关于php变量引用的面试题
- 关于C数组指针的一道面试题
- 关于javascript 数组的正态分布排序的一道面试题
- 关于&和&&的一道容易出错的小例题
- JavaScript关于变量作用域的一道面试题
- JavaScript 关于变量作用域的一道面试题
- 关于形参数组、临时变量数组大小问题
- 关于数组指针的一道面试题
- 关于FOR循环的一道面试题
- 与全局变量构造析构顺序有关的一道面试题(C++)
- 与全局变量构造析构顺序有关的一道面试题(C++)
- 关于c++ fstream的一个容易使用出错的地方。
- 与全局变量构造析构顺序有关的一道面试题(C++)
- 关于一道面试题