数组初始化的问题

tweeg_nee 2010-12-25 03:53:04
char buf[5] = {0};

后,为啥 buf 都清零了?
...全文
222 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
Super_Ninja 2010-12-25
  • 打赏
  • 举报
回复
约定!
  • 打赏
  • 举报
回复
规定。。
明月生寒 2010-12-25
  • 打赏
  • 举报
回复
数组中存在没有赋值的变量的时候,系统自动赋值为0,类似默认参数
xjmlj2010 2010-12-25
  • 打赏
  • 举报
回复
这个相当于把数组buf赋了一个空值
honbaa 2010-12-25
  • 打赏
  • 举报
回复
数组中存在没有赋值的变量的时候,系统自动赋予改变量为0,
Qyee 2010-12-25
  • 打赏
  • 举报
回复
一种习惯,一种规定。。

这就是原因,如果还问为什么。。那就问 规范吧
luciferisnotsatan 2010-12-25
  • 打赏
  • 举报
回复
char buf[5] = {0};初始话时,除了第一个显示赋0,后面的用默认值 0

char buf[5] = {1,23};这样,第一个是1,第二个23,后面没有显示给出值,用默认的0
a121212121a 2010-12-25
  • 打赏
  • 举报
回复
不错 是规定
hdusunny44 2010-12-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qq120848369 的回复:]

只有全局数组才会默认初始化为0,auto数组的值如果在定义时做了初始化,那么紧随其后的值都为0,如果定义时没有做初始化工作,那么其后的值是随机的.

如下:
C/C++ code
#include <iostream>
using namespace std;

int a[2]; //全局都是0

int main()
{
int b[2]; //b[0],b[1]是任意的
……
[/Quote]

很清晰明了。
wizard_tiger 2010-12-25
  • 打赏
  • 举报
回复
全局变量在声名时自动初始化为0。
rolax 2010-12-25
  • 打赏
  • 举报
回复
好好看看书吧。
如果想深入,可以看看C语言规范。
flysnowhite 2010-12-25
  • 打赏
  • 举报
回复
局部初始化会将未初始化的元素全部赋0值。
mapoor 2010-12-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jeremyhuang81 的回复:]

C语言中,有左值和右值的概念。
char buf[5] = {0};
buf[5]是左值,
{0}是右值,
在编译阶段,左值既然是赋值了,那么就必须要得到其具体的值是什么,
那么,buf[5]有5个值,显然他必须要知道每个值是什么,
否则的可想而知。就好比你要给5个人分钞票,结果只给1个分了,那其余的四个人,
会眼红的!

如果你用指针的话,那就未必了,因为,指针是运行的时候,……
[/Quote]

那么 int buf[5]={1}; 为什么只有第一个是1,其他全是0.
MATHPHYSIC 2010-12-25
  • 打赏
  • 举报
回复
看看书,书上有的
就想叫yoko 2010-12-25
  • 打赏
  • 举报
回复
我也认为是规定
如果不放心也可以写memset(buf, 0, 5*sizeof(char))
dh935154292 2010-12-25
  • 打赏
  • 举报
回复
这是数组的初始化
c[5]={1,2,3}; 即将才c[0]=1,c[1]=2,c[2]=3,c[3]=0,c[4]=0
c[n]={x1,x2,x3…xm}; 当m小于n时,则自动将后面的值赋为0
同时方框中的数可以没有,但要将后面的数全部列出,如
c[]={0,0,0,0,0};
同时 c[5]={}; 是违法的,大括号中不能为空
边城浪子 2010-12-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 q191201771 的回复:]

我也认为是规定
如果不放心也可以写memset(buf, 0, 5*sizeof(char))
[/Quote]

确实是规定。说个经验之谈,能用赋值操作符的,就不要用memset。
memset\memcpy没有类型检查,容易出现内存问题。最近写系统,就吃大亏了。
jeremyhuang81 2010-12-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mapoor 的回复:]
引用 2 楼 jeremyhuang81 的回复:

C语言中,有左值和右值的概念。
char buf[5] = {0};
buf[5]是左值,
{0}是右值,
在编译阶段,左值既然是赋值了,那么就必须要得到其具体的值是什么,
那么,buf[5]有5个值,显然他必须要知道每个值是什么,
否则的可想而知。就好比你要给5个人分钞票,结果只给1个分了,那其余的四个人,
会眼红的!

……
[/Quote]
那你就不能想想编译器还干了些什么事情吗?
我这样的解释,只是为了说明,编译器在编译阶段,必须给数组的每个变量,指定值。
这涉及编译的优化,也就是你们说的约定。
Microsues 2010-12-25
  • 打赏
  • 举报
回复
void main()
{
cout<<"test 1"<<endl;
char a[3] = {'0'}; //a[0]等于'0' , a的其他元素为空
char b[3] = "0"; //与上面等价
char c[3] = {0}; //都为空
for(int ix=0;ix<3;++ix)
cout<<c[ix]; //ASCII为0,打印出空
}
alfamoon 2010-12-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 q191201771 的回复:]
我也认为是规定
如果不放心也可以写memset(buf, 0, 5*sizeof(char))
[/Quote]
+1
加载更多回复(9)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧