分类: C/C++
2014-12-08 15:46:15
下面的代码片段是否能编译通过,若无法编译通过,是哪一行代码存在问题?程序的输出结果是什么?
#include
using namespace std;
#include
void Foo (char str[128]){
str++;
cout << "sizeof(str) = " << sizeof(str) << endl;
}
int main(void)
{
char str[] = "hello world"; // 改为char str[128] = "hello world";结果一样吗?
char str1[128] = {0};
char *p = str;
int n = 10;
str1++;
p++;
cout << "strlen(str) = " << strlen(str) << endl;
cout << "sizeof(str) = " << sizeof(str) << endl;
cout << "sizeof(str1) = " << sizeof(str1) << endl;
cout << "sizeof(p) = " << sizeof(p) << endl;
cout << "sizeof(n) = " << sizeof(n) << endl;
Foo(str);
return 0;
}
答案:
1. 上面的代码无法编译通过,错误语句为:str1++。
2. 输出为如下:
strlen(str) = 11
sizeof(str) = 12
sizeof(str1) = 128
sizeof(p) = 8
sizeof(n) = 4
sizeof(str) = 8
总结:
1. main函数中的“str”和“str1”数组名并不是变量,不是char类型的变量,更不是char类型的指针变量。它们是一种“数据类型”,叫做“数组类型”。如何证明?“str1++”无法编译通过即可证明str1是一种数据类型,而不是变量。对数据类型使用运算符,自然是编译不通过的。
2. 为什么函数“Foo”中的sizeof和“main”函数中的sizeof运算结果不一样?当数组名作为函数参数传递时,实际上传递的是数组的首地址,因此一个数组名参数本质是一个指针。
3. “sizeof(hello world)”的值是12而不是11,sizeof运算符将字符串结尾的结束符也计算在内,而strlen则不不包含结束符。
4. 思考一下64位Linux操作系统最大寻址空间是多大?
关于sizeof的一种简易实现
#include
#define _sizeof(T) ((size_t)((T*)0 + 1))
#define array_sizeof(T) ( (size_t)(&T+1) - (size_t)(&T) )
int main(void)
{
char arr[128] = {0};
printf("%d\n", _sizeof(int));
printf("%d, %llu, %llu\n", array_sizeof(arr), (size_t)(&arr+1), (size_t)(&arr));
return 0;
}