C中的三维字符数组

时间:2011-02-14 05:31:53

标签: c arrays multidimensional-array

我想声明一个三维字符串数组 每行有两个字符串。

我可以在此声明:

char *szArray[][2] = {
    {"string1", "string2"},
    {"string3", "string4"},
    {"string5", "string6"},
    {0, 0}
};

我想做同样的事情,但动态分配行数。

在这里,您可以假设第一维是动态决定的。 第二维是2, 第三维是25。

在很多方面都试过没有运气:(。

提前致谢!

4 个答案:

答案 0 :(得分:2)

首先,你的问题不是char的三维数组,而是指向char的二维数组。在C中,指针和数组不是一回事。

回答你的问题,现代C,C99中最简单的方法是使用可变长度数组VLA。对于三维数组,你要做

char szData[x][y][z];

其中xyz是仅在您点击该声明时在运行时确定的变量或表达式。

VLA的不便之处在于,您必须要小心它们不会因堆栈而变得太大,并且您必须通过分配给各个条目来初始化它们(这里是嵌套的for - 循环)。

继续你的二维字符串数组的例子

char* szData[x][y];

然后你必须为每个指针分配单独的字符串或将它们设置为0

for (size_t i = 0; i < x; ++i)
   for (size_t j = 0; j < y; ++j)
     szData[i][j] = 0;

答案 1 :(得分:1)

int n = 0 ;

printf("Enter the number of rows\n");

scanf("%d",&n);

char *** szData = (char *** )malloc(n * sizeof(char ** )) ;

//Allocate memroy for each row

for(int i = 0 ; i < n ; i++ )
{ 
    szData[i] = (char ** ) malloc(2 * sizeof(char * )) ;
    for ( int j = 0 ; j < 2 ; j++ )
    { 
        szData[i][j] = (char *) malloc (25 * sizeof(char));
    }
 }

 //Assign some data

 for( int i = 0 ; i < n ; i++ )
 { 
    sprintf(szData[i][0],"string%d", i); 
    sprintf(szData[i][1],"string1%d", i);
 }

 //print all the elements

 for( int i = 0 ; i < n ; i++ ) 
 { 
    printf("%s\n",szData[i][0]);
    printf("%s\n",szData[i][1]);
 } 

 //free memory here
 for(int i = 0 ; i < n ; i++ )
 {  
    for ( int j = 0 ; j < 2 ; j++ )
    { 
        delete szData[i][j];
    } 
 }

 for(int i = 0 ; i < n ; i++ )
 {  
    delete szData[i];
 }

 delete szData;

答案 2 :(得分:0)

我没有收到任何错误:

#include <stdio.h>

int main(){
char *szArray[][2] = { {"string1", "string2"}, {"string3", "string4"}, {"string5", "string6"}, {0, 0} };

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

}

这是输出:

$ gcc test.c
$ ./a.exe
string1
string5

但是你不能打印szArray [3] [0] [0],因为它是0,如果要将值初始化为任何值,你可以设置为“\ 0”而不是0

答案 3 :(得分:0)

好的,这里没有编译器可以仔细检查,但你可以通过多种方式实现。最直接的方法是声明一个char [25] [3]的向量,让c ++为你做。像Vector foo之类的东西,然后只是push_back你的动态元素。但是,如果没有编译器,我并不是100%肯定这会有效,因为在多维数组方面存在时髦的规则。你总是可以将你的数组作为第一遍进行无量纲化,以使它也能正常工作 - 像Vector一样,并开始添加你想要的东西。你也可以做char方法向量的向量,并且具有锯齿状的字符数组,其中3维可以是动态的,这甚至可能是更高效的内存。这里有很多选择。