C lang 多维数组

C lang Multidimensional arrays

刚开始玩C,我有这个

char str_arr[2][3] = {"gou", "ram"};
printf("%s / %s / %s", str_arr, str_arr[0], str_arr[1]);

打印:

gouram / gouram / ram

char str_arr[2][4] = {"gou", "ram"};
printf("%s / %s / %s", str_arr, str_arr[0], str_arr[1]);

打印:

gou / gou / ram

我真的不明白,4是最大尺寸,但一点意义都没有。

//编辑 只是想说这对我有很大帮助,对于你们大多数人来说这可能是一个愚蠢的问题,但对我来说不是,我刚刚进入内存分配和更高级的东西。 谢谢!

str_arr 传递给带有 %s 格式说明符的函数 printf 会将 undefined behavior. The %s specifier requires a char * as an argument. The expression str_arr is not a char * and will also not decay 调用为一个。但是,写 str_arr[0] 而不是 str_arr 将衰减为 char *.

在第一个例子中

char str_arr[2][3] = {"gou", "ram"};

传递 str_arr[0] 也会调用未定义的行为,原因不同:

%s 格式说明符作为函数参数指向有效字符串的指针,即指向以空字符结尾的字符序列的指针。但是,str_arr[0]str_arr[1] 都没有以空字符结尾,因为没有空位。

然而,当你写

char str_arr[2][4] = {"gou", "ram"};

有一个终止空字符的空间,str_arr[0]str_arr[1]在初始化后都会有一个,所以程序的行为是well-defined传递这些sub-arrays 到函数 printf (即没有未定义的行为)。