记得刚工作的时候,每次用字符串数组都是小心翼翼。当时基本都是这样:

char str[32];
memset(str, 0, sizeof(src));

那时颇为自豪,自认为很少有菜鸟能像我这样注意这些问题。直到后来有一次代码review,在一老鸟面前班门弄斧,结果被他指出来了,说我这样会浪费一次函数调用,直接char str[32] = {0}更好。刚开始我还以为这是一种特殊语句,是把数组的每个元素都赋0。

有一次我想把数组全初始化成1,就直接int list[4] = {1}。结果进引起了一个bug,害得我花了很长时间才找到问题所在——list中除了第一个是1,其它的都是0。于是我决定好好研究一下,争取不再犯这样的错误。

其实,这玩意很简单,简单到不能再简单了,以至于研究完了我都觉得羞愧了。。。

首先,看下面的语句:

char str[4] = {'0', '1', '2', '3'};

这是标准的数组初始化方法,字符串数组的每个元素都被赋上初始值(大括号内的个数等于数组长度)。

当大括号内的值小于数组长度的时候,比如:

char str[4] = {'0', '1'};

str[0]和str[1]会被赋上相应的初始值,而剩下的元素会被初始化成0。这基本是没本C语言书里面都会讲到的。

所以,反过来再看看之前的例子:

int list[4] = {1};

就是把第一个元素赋1,其他的元素都被初始化成0。

就是这么简单。