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 呀。 展开
如果要每个单元都赋值0,应该是char buff[5]={0,0,0,0,0};或者memset()这个函数来填充。
但是为什么还是看的很多人喜欢char buff[5]={0};这样用呢,这样仅仅是第一个单元被赋值为0 呀。 展开
5个回答
展开全部
需要注意的是: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};是一种定义空字符数组的严谨的写法!
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};也是没问题的!
展开全部
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
是可以把这个数组的所有元素的赋值成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的代码反汇编之后看一下,是否类似。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一、全局或静态数组
char gBuf[5] = {0}; // 第一个元素gBuf[0] = 0,后续4个单元都会被置成0
二、函数局部数组
int func()
{
char buf[5] = {0}; // 第一个元素gBuf[0] = 0,后续4个单元随机值(编译器相关)
}
字符串义'\0' == 0结束,字符数组buf第一个元素为结束符,代表buf存储内容为空字符串。
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的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询