我正在声明一个二维数组:
char arr[10][10];
arr[0][0] = 'X';
现在我在调试器中打印;
(lldb) po arr[0][0]
'X'
真棒!!没问题。
现在我正在声明一个二维数组:
int col = 10;
int row = 10;
char arr[row][col];
arr[0][0] = 'X';
现在我在调试器中打印;
(lldb) po arr[0][0]
error: subscript of pointer to incomplete type 'char []'
error: 1 errors parsing expression
为什么?
答案 0 :(得分:17)
调试器并不确切知道数组的大小,因此您需要应用强制转换:
(gdb) p ((char (*)[10])arr)[0][0]
$2 = 88 'X'
答案 1 :(得分:13)
所以dbush是对的。但这就是为什么更深入一点。
char arr[10][10];
与
不同char arr[row][col];
即使他们看起来和行为相似。
在C89标准中,第二个是非法的,因为编译器不知道为变量分配了多少空间(即使在前两行中定义了这些空间)。
输入C99标准,他们引入了一种称为可变长度数组的东西。数组的空间分配在运行时确定,而在编译时确定 。现在,您可以将一些变量传递给函数,并声明一个基于这些变量的大小的数组。好极了!
但这意味着编译器官方并不知道有关该阵列的详细信息。就像它有多大。 LLDB使用Clang / LLVM编译器来理解代码。
这是语言变得略高的一个例子,并且抽象了它在幕后所做的工作。偶尔会咬你的屁股。
答案 2 :(得分:2)
制作col
和row
const
const int col = 10;
const int row = 10;