问答

如何去理解 C语言中 sizeof?

作者:admin 2021-04-18 我要评论

有个疑问,看《C Primer Plus》的第4章里面有提到 再看看以下写的测试程序 // 例1char name[10] = "1234567890";printf("%d\n", sizeof(name)); // 10printf("%d...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

有个疑问,看《C Primer Plus》的第4章里面有提到
image.png

再看看以下写的测试程序

// 例1
char name[10] = "1234567890";
printf("%d\n", sizeof(name)); // 10
printf("%d\n", strlen(name)); // 10
printf("%s\n", name); // 1234567890

// 例2
char a[] = "123";
printf("%d\n", sizeof(a)); // 4
printf("%d\n", strlen(a)); // 3

sizeof 既然包括 \0,那为什么例1里的 sizeof 输出是 10,而不是11,即使为10,那减去 \0 这个字节后,剩下的字节空间不应该是 9 吗,例1里的 name 输出不应该是“123456789”?

例2里的结果,我倒是比较理解,因为 a 里其实有个隐藏的字节存储 \0。

例1的程序和我所期待的结果有出入,想请教下各位大佬,应该如何去理解 sizeof ?。

----- 补图 -----
![image.png

###

看了书本的第六章的11小节......这才是正确的答案,在C语言里,虽然字符串是用字符数组来存储,但是字符数组并不一定是字符串,从概念上来看,字符数组末尾可以没有\0,字符串末尾必须有\0。也就是说例1的 name 数组是合法的,sizeof 是用于得到数组的长度,sizeof(name) 自然等于10,name 数组不包含\0,所以它不是字符串,只是一个字符数组,而例2 里的 a 数组既是字符数组,也是字符串。
另外:

char a[] = "123"; // 会自动补 \0
char a[3] = "123"; // 不会自动补 \0

image.png

###

首先namea后面都带有一个\0,但是你指定了name的长度,所以'1234567890'后面的\0被截取了。而a因为没有指定长度,编译器给你分配了适当的长度,所以\0被保留了。你将第一行改为char name[] = "1234567890"则一切正常了。 sizeof不在乎包不包含\0的问题,sizeof是求数组的长度,它在编译器就确定,它不会在乎你数组中存的是什么。而strlen才在乎是否含有\0

###

例1是不对的,学c语言刚开始就会告诉你字符数组的最后一个是'\0',因此长度为10的数组只能存9个字符,你的能通过是编译器不严谨,我用g++是不能通过编译的。
image.png
如果最后一个元素不是'\0',printf会一直输入,直到遇到内存中的'\0'

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器