咨询:这段C语言二维字符数组的初始化方式是怎样的?
理解这段C语言二维字符数组的初始化
咱们先把这段代码拆解开,一步步看它的初始化逻辑:
char words[][MAXLENGTH] = { "india", "pakistan", "nepal", "malaysia", "philippines", "australia", "iran", "ethiopia", "oman", "indonesia" };
1. 第一维长度的自动推导
这里的words[][MAXLENGTH]故意把第一维的长度留空了——这是C语言的实用特性:当你用初始化列表初始化二维数组时,只要指定了第二维的长度,编译器会自动数初始化列表里的元素个数,把它作为第一维的长度。
这个例子里初始化列表有10个字符串,所以编译器会自动把words的第一维长度设为10,等效于你写了char words[10][MAXLENGTH];。
2. 单个字符串的存储细节
二维字符数组可以看成“装字符串的数组”:每一个words[i](i从0到9)都是一个长度为MAXLENGTH的char数组,用来存对应的字符串:
- 比如
words[0]存"india":字符'i'、'n'、'd'、'i'、'a'会依次放到words[0][0]到words[0][4],C语言会自动在末尾补一个字符串结束符'\0'(也就是words[0][5] = '\0'),这样它才是合法的C字符串。 - 每个一维数组里剩下的位置(比如
words[0][6]到words[0][MAXLENGTH-1]),如果是全局/静态数组会被自动初始化为'\0';如果是局部数组,未用到的位置会是随机值,但不影响字符串的正常使用——因为我们判断字符串结束只看'\0'。
3. 必须注意的MAXLENGTH取值
你得保证MAXLENGTH的长度大于等于列表里最长字符串的长度+1(多出来的1是给'\0'留位置)。比如这里最长的字符串是"philippines",长度是11,那MAXLENGTH至少要设为12,不然长字符串会被截断,导致程序行为异常。
内容的提问来源于stack exchange,提问作者Faizan
相关产品推荐
相关产品推荐

