如何在C中初始化3d数组

时间:2013-10-15 14:27:03

标签: c arrays

我有一个数组:

char array[4][4][2];

我想要的是一个表4x4,它在每个位置分配一个由两个字符组成的字符串。但是,当我像这样初始化数组时:

char array[4][4][2] = {{"AA", "BB","  ", "  "}, {"CC", "DD", "  ", "  "}, {"EE","FF","  ","  "}};

并制作:

printf("%s\n", array[0][0]);

输出结果为:

AABB    CCDD    EEFF 

那么,这样做的正确顺序是什么?我没有在任何地方找到它。

3 个答案:

答案 0 :(得分:3)

确实是char数组的正确初始化。但由于您的数组不是NUL(%s)终止,因此您无法使用\0。根据你的声明,你可以写:

printf("%c%c\n", array[0][0][0], array[0][0][1]);

或者更正数组维度,使其容纳长度为2的字符串,后跟'\0'终止符:

char array[4][4][3] = { {"AA", "BB", "  ", "  "}, 
/*               ^  */  {"CC", "DD", "  ", "  "}, 
                        {"EE", "FF", "  ", "  "}
                      };

答案 1 :(得分:2)

C中的字符串需要终结符'\0'。因此,对于具有两个可见字符的字符串,2个字符的数组太小。

这是C字符串数组初始化的一个特性,你不会因为你做的事情而得到警告或错误;通常在C中,我们假设你知道自己在做什么。

如果你这样做:

char foo[] = "foo";

你会得到一个带有终结符的四字符数组,但如果你这样做了

char bar[3] = "bar";

你不会得到终结者,因为它不适合,但你也不会得到错误。

要解决此问题,请将第三个尺寸增加到[3],以便为终结器腾出空间。

许多程序员可能会将其实现为字符指针的2D数组,但它使用的内存比设计多得多。它确实会给你带来简约:

const char *array[2][2] = { { "AA", "BB" }, { "CC", "DD" } };

这将使编译器将实际的字符数据添加到终止符中, somewhere 在内存中,而array将只是一个指向正确位置的2x2指针数组。每个字符串的开头。

答案 2 :(得分:2)

尝试以下方法:

int ii, jj;
const char *array[2][2] = {{"hello", "world"},{"these are", "strings"}};
for (ii=0; ii<2; ii++) {
  for (jj=0; jj<2; jj++) {
    printf("%s\n", array[ii][jj]);
  }
}

这将向您展示如何正确分配2D字符串数组 - 您不确定每个字符串的大小,它由初始化决定。

编译器将确保它们以空终止和所有内容 - 它们甚至不需要具有相同的大小。

注意 - 我实际上做的是创建一个2D数组指针,而不是3D数组字符。这更灵活,更适合您的情况,因为您似乎对字符串感兴趣(字符串数组,但通过指向它们的开始引用;并且正如@unwind指出的那样,它们需要以null结尾)