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