推荐答案
测试一下
题目
systemverilog语句,已知:
A.arr[0][0]=new[2];
B.arr[1][0]=new[2];
C.arr[0][ ]=new[2];
D.arr[0][1][1]=new[2];
参考答案与知识点
参考答案
正确选项为A。
解析:
1. 理解变量声明:`int arr[2][ ][ ]` 是一个多维动态数组,其中第一维固定为2(静态),后两维是动态的。即 `arr` 是一个包含2个元素的固定数组,每个元素是一个动态数组(该动态数组的元素又是动态数组,最终元素是int类型)。
2. 已知 `arr[0] = new[4];` 为 `arr[0]` 分配了一个大小为4的动态数组,其每个元素是未初始化的动态数组(句柄为null)。
3. 选项分析:
- A. `arr[0][0] = new[2];` 合法。`arr[0]` 是长度为4的动态数组,`arr[0][0]` 是该数组的第一个元素(类型为动态数组句柄),通过 `new[2]` 为其分配一个大小为2的动态整数数组,完全正确。
- B. `arr[1][0] = new[2];` 非法。`arr[1]` 从未被分配(仍为null),访问 `arr[1][0]` 会导致空指针解引用,编译时一些工具可能报错,运行时必然崩溃。
- C. `arr[0][ ] = new[2];` 非法。语法错误,`[ ]` 不是合法的索引表达式,不能直接用于赋值左侧。正确写法应指定具体索引如 `arr[0][0]`。
- D. `arr[0][1][1] = new[2];` 非法。首先确保 `arr[0][1]` 已被分配(此处未分配),即使已分配,`arr[0][1][1]` 是整型变量,不能存储动态数组句柄,类型不匹配。
4. 易错点:
- 混淆多维动态数组的层级:`arr[0]` 是动态数组,`arr[0][0]` 是动态数组,`arr[0][0][0]` 才是整数。
- 忘记动态数组在使用前必须分配,否则访问任何元素都是非法的。
- 忽略赋值两侧类型必须匹配:`new[n]` 返回动态数组句柄,只能赋给相同类型的动态数组变量,不能赋给整型变量。
涉及知识点
- 多维动态数组的声明与层级
- 动态数组的分配(new)与初始化
- 数组索引的合法性检查
- 句柄与数据类型的匹配
- 空指针解引用错误