【问题标题】:String initialization in multidimensional array多维数组中的字符串初始化
【发布时间】:2012-12-30 08:54:53
【问题描述】:

如何在多维数组中分配字符串值,将数组作为函数参数发送,并返回给主函数?我试过了,但它给出了一个错误:

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); 

【问题讨论】:

  • 您混淆了字符和字符串。您的数组是 chars 的数组,而不是字符串。
  • 15.6MB 的字符串数据。可怜的堆栈。
  • char *a[250][250] 将节省 96% 空间。

标签: c multidimensional-array


【解决方案1】:

声明后不能赋值,使用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个二维数组组成,其中每个二维数组由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}
            },
        };

Link to understand


第二个错误

对于这个a[i][j][max],一个字符不能分配字符串,所以,

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

但是

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

请阅读WhozCraig comment。您正在堆栈中声明巨大的内存!


根据your comment

函数声明:

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 : 哪个传递给函数?
  • a[][][] 的当前值将作为函数参数传递给函数并返回其他多维数组变量。
  • @sabbir_pstu 好的,我想应该是 add_func( a, i, j ); 不能分配给 a[i][j][max]
  • @sabbir_pstu:你需要显示add_func的定义,然后我可以帮你。
  • char add_func(char a[250][250][250], int i, int j); // 函数定义
【解决方案2】:

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

这样就可以了

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,很久以前有位导师称其为数组的“上级”维度。他将所有其他维度称为“劣等”维度。我还看到它们被称为“主导”和“次主导”。
【解决方案3】:

您可能想改用指针:

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

【讨论】:

  • 假设每个条目都不会被更改,这将起作用。
  • 绝对正确。但是您仍然可以通过 a[i][j] = "something"a[i][j] = strdup(something) 等结构来分配单个字符串。
猜你喜欢
  • 2011-01-05
  • 2015-07-25
  • 2011-06-04
  • 1970-01-01
  • 2016-11-12
  • 2010-10-25
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多