访问时,变量二维数组打印“指向不完整类型的下标”

时间:2016-01-22 16:50:15

标签: c arrays variable-length-array

我正在声明一个二维数组:

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

为什么?

3 个答案:

答案 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)

制作colrow const

const int col = 10; const int row = 10;