我想声明一个三维字符串数组 每行有两个字符串。
我可以在此声明:
char *szArray[][2] = {
{"string1", "string2"},
{"string3", "string4"},
{"string5", "string6"},
{0, 0}
};
我想做同样的事情,但动态分配行数。
在这里,您可以假设第一维是动态决定的。 第二维是2, 第三维是25。
在很多方面都试过没有运气:(。
提前致谢!
答案 0 :(得分:2)
首先,你的问题不是char
的三维数组,而是指向char
的二维数组。在C中,指针和数组不是一回事。
回答你的问题,现代C,C99中最简单的方法是使用可变长度数组VLA。对于三维数组,你要做
char szData[x][y][z];
其中x
,y
和z
是仅在您点击该声明时在运行时确定的变量或表达式。
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维可以是动态的,这甚至可能是更高效的内存。这里有很多选择。