免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2552 | 回复: 15
打印 上一主题 下一主题

请教关于指针数组的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-30 14:47 |只看该作者 |倒序浏览
想请教一个关于指针数组的问题.
char buf[] = "hello";
buf[6]会自动补为'\0';
但是为什么
char *buf[] = {"hello", "world", "yes"};
这种情况sizeof(buf)的结果为12呢?
就是说为什么buf[3]不被自动补为NULL呢?
谢谢各位指教.

论坛徽章:
0
2 [报告]
发表于 2007-07-30 14:50 |只看该作者
第二种情况
sizeof (buf)
其实就是
sizeof (char *) * 3,你的是32位机器,自然就是4*3 = 12了

论坛徽章:
0
3 [报告]
发表于 2007-07-30 14:51 |只看该作者
只有字串编译器会自动补'\0'。第二个是指针数组,不会的。

论坛徽章:
0
4 [报告]
发表于 2007-07-30 14:55 |只看该作者
佩服lz的探索精神阿

原因:
其实是因为编译器不认识NULL阿,NULL是人为定义的东西,编译器敢随便给你东西么?那你不会把它杀拉阿

论坛徽章:
0
5 [报告]
发表于 2007-07-30 16:10 |只看该作者
原帖由 Jiangge 于 2007-7-30 14:55 发表
佩服lz的探索精神阿

原因:
其实是因为编译器不认识NULL阿,NULL是人为定义的东西,编译器敢随便给你东西么?那你不会把它杀拉阿



谢谢, 但是如果按照您的解释来说的话为什么
char *buf[4] = {"hello", "world", "yes"};
这种情况下buf[3]就可以自动赋为NULL了呢?
谢谢指教.

论坛徽章:
0
6 [报告]
发表于 2007-07-30 16:15 |只看该作者
原帖由 cunettenuc 于 2007-7-30 16:10 发表



谢谢, 但是如果按照您的解释来说的话为什么
char *buf[4] = {"hello", "world", "yes"};
这种情况下buf[3]就可以自动赋为NULL了呢?
谢谢指教.


对不起,我错了哈。

也许编译器学会认识这个了,不过应当初始化0吧

论坛徽章:
0
7 [报告]
发表于 2007-07-30 16:19 |只看该作者
原帖由 cunettenuc 于 2007-7-30 16:10 发表



谢谢, 但是如果按照您的解释来说的话为什么
char *buf[4] = {"hello", "world", "yes"};
这种情况下buf[3]就可以自动赋为NULL了呢?
谢谢指教.

指定指针数组大小为4,第四个没显式初始化,编译器初始化为0了
至于char *buf[] = {"hello", "world", "yes"};数组大小为3,也就不存在后面的0了

论坛徽章:
0
8 [报告]
发表于 2007-07-30 16:23 |只看该作者
原帖由 ivhb 于 2007-7-30 14:50 发表
第二种情况
sizeof (buf)
其实就是
sizeof (char *) * 3,你的是32位机器,自然就是4*3 = 12了

正解
只有把字符串常量赋给字符数组时才会自动加上'\0'

其他情况是不会的。而且字符数组也和其他数组一样,不要求非要加 '\0'

只有把字符数组当成字符串时才会要求加上'\0',因为很多库函数都是靠'\0'来知道字符串的结束。
所以才人为约定或编译器自动的加上'\0'(否则调用库函数可能就出错)

论坛徽章:
0
9 [报告]
发表于 2007-07-30 16:26 |只看该作者
原帖由 zwylinux 于 2007-7-30 16:19 发表

指定指针数组大小为4,第四个没显式初始化,编译器初始化为0了
至于char *buf[] = {"hello", "world", "yes"};数组大小为3,也就不存在后面的0了

还是这贴回答的对头!...
我也学习学习!

论坛徽章:
0
10 [报告]
发表于 2007-07-30 16:27 |只看该作者
原帖由 zwylinux 于 2007-7-30 16:19 发表

指定指针数组大小为4,第四个没显式初始化,编译器初始化为0了
至于char *buf[] = {"hello", "world", "yes"};数组大小为3,也就不存在后面的0了


哦,是不是说对于字符数组这种情况,会在字符数组最后面加上一个'\0',所以sizeof()的大小会比字符数组此时的长度大一个.
而对于其它的类型,则不会这样.
比如int a[] = {1, 2, 3};其大小也为sizeof(int)*3这么大.
而字符数组这样的原因是因为其以此方式来使这个字符串有结束符. 而其它方式不需要.
请指教.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP