单选题
1、以下能对二维数组a进行正确初始化的语句是()。
A
int a[2][]={{1,0,1},{5,2,3}};
B
int a[][3]={{1,2,3},{4,5,6}};
C
int a[2][4]={{1,2,3},{4,5},{6}};
D
int a[][3]={{1,0,1}{},{1,1}};
答案解析
正确答案:B
解析:
这道题考查的是 C 语言中二维数组初始化的语法规则。我们需要逐一分析每个选项,看其是否符合编译器的要求。
**核心规则回顾:**
1. **维度省略规则**:在初始化时,可以省略第一维(行)的大小,编译器会根据初始值的个数自动计算;但**绝对不能省略第二维(列)的大小**。因为编译器需要知道每一行有多少个元素,才能正确地进行内存分配和地址计算。
2. **初始化列表格式**:使用花括号 `{}` 包裹初始值。如果是分行初始化,通常外层花括号内包含多个内层花括号,每个内层花括号代表一行。
3. **缺省补零**:如果提供的初始值少于数组定义的总元素个数,剩余的元素会自动初始化为 0。
**选项分析:**
* **A. `int a[2][]={{1,0,1},{5,2,3}};`**
* **错误**。这里省略了第二维(列)的大小 `[]`。C 语言规定,二维数组初始化时,必须指定列数(第二维),否则编译器无法确定每行的宽度,也就无法确定数据的存储布局。
* **B. `int a[][3]={{1,2,3},{4,5,6}};`**
* **正确**。
* 省略了第一维(行)的大小,这是允许的。编译器会根据后面有两个子列表 `{1,2,3}` 和 `{4,5,6}` 推断出行数为 2。
* 指定了第二维(列)的大小为 3。
* 初始化列表格式正确,每行有 3 个整数,与列宽匹配。
* 最终数组等价于 `int a[2][3]`。
* **C. `int a[2][4]={{1,2,3},{4,5},{6}};`**
* **错误**(或者说存在严重问题,通常被视为错误或不符合题意)。
* 虽然语法上某些编译器可能允许这种“嵌套层级过多”或“部分初始化”的写法,但在标准的二维数组初始化语境下,这个选项的问题在于它试图用 3 个子列表 `{1,2,3}`, `{4,5}`, `{6}` 去初始化一个只有 **2 行** (`a[2][4]`) 的数组。
* 第一个子列表 `{1,2,3}` 会初始化第一行。
* 第二个子列表 `{4,5}` 会初始化第二行。
* 第三个子列表 `{6}` **超出了数组的行数范围**(因为只有 2 行)。这会导致编译错误(too many initializers)。
* *注:即使理解为扁平化初始化,写法也不规范。通常二维数组初始化要么按行分组,要么完全扁平。这里明显的错误是初始化的行数超过了定义的行数。*
* **D. `int a[][3]={{1,0,1}{},{1,1}};`**
* **错误**。初始化列表的语法格式错误。
* `{1,0,1}{}` 这种写法是不合法的。子列表之间应该用逗号 `,` 分隔,而不是直接连写。
* 正确的写法应该是 `{{1,0,1}, {}, {1,1}}` (假设意图是三行)。
* 此外,中间的空 `{}` 虽然在某些标准下可能表示全零行,但结合前面的语法错误,整个语句是非法的。
**结论:**
只有选项 **B** 完全符合 C 语言二维数组初始化的语法规则:省略第一维,指定第二维,且初始值数量与数组维度匹配。
**正确答案:B**
题目纠错
c语言选择判断题库
相关题目
单选题
7.以下运算符中,优先级最高的运算符是()。
单选题
6.下列字符序列中,不可用作C语言标识符的是()。
单选题
5.C语言中的文件的存储方式有()。
单选题
4.C语言程序中,若对函数类型未加显式说明,则函数的隐含说明类型为()。
单选题
3.数组名作为实参数传递给函数时,数组名被处理为()。
单选题
2.经下列语句定义后,sizeof( ),sizeof( ),sizeof( ),sizeof( )在 微机上的值分别为()。 char x=65; float y=7.3; int a=100; double b=4.5;
单选题
1.设有以下语句, 若0<k<4,下列选项中对字符串的非法引用是()。 char str[4][2]={“aaa”,”bbb”,”ccc”,”ddd”},*strp[4]; int j; for (j=0;j<4;j++) strp[j]=str[j];
