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
(即没有未定义的行为)。
刚开始玩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
(即没有未定义的行为)。