C语言关于数组赋初值的问题char buff[10]={0};

在C语言中charbuff[5]={0};这条语句执行的结果是只有buff[0]是等于0的,其他单元都未赋值。如果要每个单元都赋值0,应该是charbuff[5]={0,... 在C语言中char buff[5]={0}; 这条语句执行的结果是 只有buff[0]是等于0的,其他单元都未赋值。
如果要每个单元都赋值0,应该是char buff[5]={0,0,0,0,0};或者memset()这个函数来填充。
但是为什么还是看的很多人喜欢char buff[5]={0};这样用呢,这样仅仅是第一个单元被赋值为0 呀。
展开
 我来答
dwjchdu
2013-12-03 · TA获得超过5914个赞
知道大有可为答主
回答量:4576
采纳率:60%
帮助的人:1085万
展开全部
需要注意的是:char buff[5]={0};和char buff[5]={'0'};是两个完全不同的概念:
char buff[5]={0};的赋的是一个字符串的结束符,而不是一个字符'0';
char buff[5]={'0'};才是给第一个字符赋值为'0'。
大家喜欢用char buff[5]={0};主要是想制造一个空的字符串,
你调试一下就知道了:
如果这样写:
#include <stdio.h>
void main
{
char buff[5]={0};
printf("%s",buff);
}
是没有任何输出的,因为printf遇到的buff的第一个字符就是个字符串的结束符'\0'
而如果这样写:
#include <stdio.h>
void main
{
char buff[5]={'0'};
printf("%s",buff);
}
才会看到输出了一个'0'
这才是你理解的给第一个单元赋值为‘0’。
char buff[5]={0};是一种定义空字符数组的严谨的写法!
更多追问追答
追问
我没有理解成:这才是你理解的给第一个单元赋值为‘0’。

你没有理解我的问题,我的问题也说了是数组,不是字符串。
追答
好吧,那就简单地说:一般定义char buff[5]={0};都是把它看成是一个字符串,是一种简洁的写法,把第一个元素就赋值成为字符串的结束符,以字符串的方式输出的时候,系统不会理会后面的元素是什么,因为第一个就是结束符!
如果后面要用字符数组的方式使用,操作每一个元素的话,那就用char buff[5]={0,0,0,0,0};也是没问题的!
qmg1023
推荐于2018-03-11 · TA获得超过888个赞
知道小有建树答主
回答量:804
采纳率:0%
帮助的人:898万
展开全部
当buff作为字符串使用的时候,第一个字符被赋值为0(好像就是'\0'),这个字符串就是一个空串,也算是一种合理的初始化方式。

当然如果不是作为字符串,而是作为数组,就存在你说的问题了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mafangsan
2013-12-03 · TA获得超过1.2万个赞
知道大有可为答主
回答量:1万
采纳率:71%
帮助的人:2537万
展开全部
char buff[10]={0};
是可以把这个数组的所有元素的赋值成0的。

不信你用下面的代码测试一下。

#include <stdio.h>

void main()
{
char buff[5]={0};
int i;
for(i=0;i<=4;i++)
{
printf("%d",buff[i]);
}
}

因为有一条规则:在数组定义的时候如果同时赋初值,未被赋值的元素都是0
追问
#include  看这个就知道你是在VS上编程的,在VS上的确是其他的都赋值成0,但是在其他编译器上是一样的吗? 据我所知,IAR就不是。

“在数组定义的时候如果同时赋初值,未被赋值的元素都是0” 这条规则是在哪儿出现的,希望给个链接。
追答
我没用过IAR,你把IAR上的这段代码反汇编后贴出来出来看一下就行了。

如下是vs2010在 win 7 64位上面把 char buff[5]={0}; 反汇编出来的代码:

013D13D8 mov byte ptr [ebp-10h],0
013D13DC xor eax,eax //注意这一句
013D13DE mov dword ptr [ebp-0Fh],eax //注意这一句

你把IAR的代码反汇编之后看一下,是否类似。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bo_kuang
2013-12-03
知道答主
回答量:38
采纳率:0%
帮助的人:21.6万
展开全部
一、全局或静态数组
char gBuf[5] = {0}; // 第一个元素gBuf[0] = 0,后续4个单元都会被置成0
二、函数局部数组
int func()
{
char buf[5] = {0}; // 第一个元素gBuf[0] = 0,后续4个单元随机值(编译器相关)
}
字符串义'\0' == 0结束,字符数组buf第一个元素为结束符,代表buf存储内容为空字符串。
追问
刚才在VS2005内试了一下,只要第一个单元赋值,不管是什么值,后面的单元都自动赋值0值,局部数组和函数数组都一样。

当初在IAR上的时候,是不会自动赋值后面的单元的,回去需要再确认一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-12-03
展开全部
char buff[5]={0};这样写赋初值,虽说没有给buff[1]-buff[4]赋值,但是默认是赋值0的,这样写没问题。很多教材上都有的。
更多追问追答
追问
我在开发平台上调试过,buff[1]-buff[4]的赋值并没有默认为0,而是为其他值。如果默认为0,可能还迷惑到我,误以为是char buff[5]={0};这个语句给全数组赋值0了。

所以还是那个问题。
追答
不会吧,你在什么平台上开发的。如果只是赋了部分值,其他的默认会赋值为0的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式