LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 738|回复: 4

老帖新问题

[复制链接]
发表于 2006-3-25 13:53:15 | 显示全部楼层 |阅读模式
在索引里面看到这么一个帖子,打印:


  1. 打印相同的字符的结果不一样。
  2. printf( "%d\n", sizeof( "" ) );
  3. 这里的结果是1
  4. printf( "%d\n", strlen( "" ) );
  5. 这里的结果是0
复制代码

说sizeof("")的大小是1,而sizeof(char*)是4啊,这个是不是char[]和char*的区别,还是别的什么?

现在有的c++已经支持声明大小为0的数组了(int a[0];),不知道sizeof(a)是不是也是1。

还有一些类似的问题:

struct node{};

sizeof(node) 为 1

大家有什么高见,讲讲
发表于 2006-3-25 16:36:06 | 显示全部楼层
首先 char  a[size]定义的字符串最后一字节是"\0",所以char a[9]定义的字符串可以放9个字符,但sizeof(a)长度是10,因为sizeof(a)求长度时包含了最后一个"\0"。而strlen(a)的结果是9,不算最后那一个"\0"的。

char a[]="123456"  与 char *a="123456"差别记得是最后有没有那个"\0",记不清楚了,自己验证下。

sizeof(char*)的值是4,因为在32位系统中,指针是4字节长的。
sizeof(struct node)要看node的具体定义了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-25 16:44:30 | 显示全部楼层
其实是一样的,只是字符数组是固定地址的而已.如char a[]="123456"大小是7,包括了最后的'\0'的.
回复 支持 反对

使用道具 举报

发表于 2006-3-25 22:20:10 | 显示全部楼层
said something wrong, so erased.
im sorry.
回复 支持 反对

使用道具 举报

发表于 2006-3-26 16:04:25 | 显示全部楼层
Post by mousse
在索引里面看到这么一个帖子,打印:


  1. 打印相同的字符的结果不一样。
  2. printf( "%d\n", sizeof( "" ) );
  3. 这里的结果是1
  4. printf( "%d\n", strlen( "" ) );
  5. 这里的结果是0
复制代码

说sizeof("")的大小是1,而sizeof(char*)是4啊,这个是不是char[]和char*的区别,还是别的什么?

是的,char[] 和 char* 是不一样的,对于 “”之类的,编译器一般解析为数组,看如下的例子:

  1. [rick@Fedora-Core ~]$ cat test.cc
  2. #include <typeinfo>
  3. #include <iostream>

  4. using namespace std;

  5. int main()
  6. {
  7.         char arr[1];
  8.         char* p;

  9.         cout<<typeid("").name()<<endl;
  10.         cout<<typeid(arr).name()<<endl;
  11.         cout<<typeid(p).name()<<endl;

  12.         return 0;
  13. }
  14. [rick@Fedora-Core ~]$ g++ test.cc
  15. [rick@Fedora-Core ~]$ ./a.out
  16. A1_c
  17. A1_c
  18. Pc
复制代码

现在有的c++已经支持声明大小为0的数组了(int a[0];),不知道sizeof(a)是不是也是1。

这个自然应该是0吧,你写的是0,还想让他不是0啊?

还有一些类似的问题:

struct node{};

sizeof(node) 为 1

这个是1可以理解,一个结构总要有空间,给多少呢?既然他没成员,就给个最小的给他好了,那就是1了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表