多维数组中的字符串初始化

4
如何在多维数组中分配字符串值,将数组作为函数参数发送,并将其返回到主函数?我尝试了这个方法,但它出现了错误:
char a[250][250][250];   // does not work
a[][0][2] = "0";         // does not work
a[][1][2] = "0";         // does not work

char a[][2][2] = {"0", "1"};  // works

// error: expected primary-expression before ']' token
a[i][j][max] = add_func(a[i][j][], i, j); 

你混淆了字符和字符串。你的数组是char类型的数组,而不是字符串。 - SomeWittyUsername
5
15.6MB的字符串数据。栈很不好,很可悲。 - WhozCraig
1
char *a[250][250] 可以节省 96% 的空间。 - Shiplu Mokaddim
3个回答

7

为了初始化字符表,您可以使用花括号。最外层维度(我不知道该怎么称呼它)或方括号中的最左边的数字是可选的。

因此,以下方法可行:

char table[][3][10] = {
    {"row1-col1", "row1-col2", "row1-col3"},
    {"row2-col1", "row2-col2", "row2-col3"},
    {"row3-col1", "row3-col2", "row3-col3"},
    {"row4-col1", "row4-col2", "row4-col3"}
    };

你不需要手动输入 table[4][3][10]。编译器会自动计算它的大小。 table 的大小是 120 字节。由于内容都是字符串,你可以使用

char *table[][3] = ...

这将节省20%的空间

花括号只能在初始化阶段使用,之后不能再使用。因此以下代码将无法工作。

a[][0][2] = "0"; 

+1,很久以前一个导师称之为数组的“上级”维度。其他维度他称之为“下级”维度。我也见过它们被称为“主导”和“次要”。 - WhozCraig

6

声明后不能赋值,但可以使用 strcpy()

char a[250][250][250];

strcpy(a[0][1],"0");

或在声明时分配:
char a[250][250][250] = {"0","2"};  
char a[][250][250] = {"0","2"}; 

或者如果您想指定一个单个字符。

a[i][j][k] = '0'; 

当i、j、k的值小于250时:


C语言中如何声明和初始化3D数组

一般情况下,a[3][4][2]是一个三维数组,可以视作:

a[3][4][2]:由3个二维数组组成,每个2-D数组都包含4行和2列。可以声明为:

char a[3][4][2] =  { 
                       { //oth 2-D array 
                         {"0"},
                         {"1"},
                         {"2"},
                         {"4"}
                       },
                       { //1th 2-D Array
                         {"0"},
                         {"1"},
                         {"2"},
                         {"4"}
                       },
                       { //2nd 2-D array
                         {"0"},
                         {"1"},
                         {"2"},
                         {"4"}
                       },
                   };  

注意:"1" 表示两个字符,一个额外的 null ('\0') 字符。

如果是整数数组:

int a[3][2][3]=  
        {
            { //oth 2-D array, consists of 2-rows and 3-cols
            {11, 12, 13},
            {17, 18, 19}
            },
            {//1th 2-D array, consists of 2-rows and 3-cols
            {21, 22, 23},
            {27, 28, 29}
            },
            {//2th 2-D array, consists of 2-rows and 3-cols
            {31, 32, 33},
            {37, 38, 39}
            },
        };

链接,用于了解更多信息。


第二个错误

a[i][j][max] 中的 char 只能赋值为单个字符而非字符串,因此需要注意。

a[i][j][max] = '0' ; // is correct  expression 

但是
a[i][j][max] = "0";  // is not correct, wrong   

请阅读WhozCraig的评论。你正在在堆栈中声明大量内存!


根据你的评论

函数声明:

char add_func(char a[250][250][250], int i, int j); // function definition  

尝试这样做:
  char a[250][250][250];
  a[i][j][max] = add_func(a, i, j );

@sabbir_pstu:传递到函数中的参数是哪个? - Grijesh Chauhan
将a[][][]的当前值作为函数参数传递,并返回其他多维数组变量。 - sabbir
@sabbir_pstu 好的,我猜应该是这样 add_func( a, i, j ); 无法赋值给 a[i][j][max] - Grijesh Chauhan
@sabbir_pstu:你需要展示 add_func 的定义,然后我才能帮助你。 - Grijesh Chauhan
@sabbir_pstu 改进了我的答案,你可以重新检查。 - Grijesh Chauhan
显示剩余2条评论

2
您可能想要使用指针代替:

您可能希望使用指针而不是:

char *a[2][2] = { "0", "1", "2", "3" };

假设每个条目都不会被更改,那就可以工作。 - Mats Petersson
绝对正确。但是你仍然可以通过类似 a[i][j] = "something"a[i][j] = strdup(something) 的结构来分配单个字符串。 - CubeSchrauber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接