Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108832
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 244
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-02 11:07
个人简介

联系方式:825988516@qq.com 业精于勤荒于嬉 行成于思毁于随

文章分类
文章存档

2014年(12)

我的朋友

分类: 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而不是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;

}

阅读(2234) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~