关于sizeof运算符的思考

2370阅读 0评论2014-12-08 cqw_cu_
分类:C/C++

下面的代码片段是否能编译通过,若无法编译通过,是哪一行代码存在问题?程序的输出结果是什么?

 

#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而不是11sizeof运算符将字符串结尾的结束符也计算在内,而strlen则不不包含结束符。

4.       思考一下64Linux操作系统最大寻址空间是多大?

 

关于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;

}

上一篇:memmove和memcpy的一种简单清晰的实现
下一篇:开源jwplayer+tomcat+nginx搭建互联网视频平台