2011-02-14 18 views
0

文字列の3次元配列 を宣言したいところ、各行に2つの文字列があります。ここでCの3次元文字配列

私はそれを宣言することができる午前:

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

私は同じことをしたいが、行数が動的に割り当てられます。

ここでは、第1次元が動的に決定されると仮定できます。 第二次元は 第3次元は多くの方法で運を試した:(25

で、2で事前に

おかげ

+0

? –

+0

CとC++は同じ言語ではありません。 – Cascabel

+0

あなたの編集の質問全体を変更しました。彼はどちらか/または解決策が必要だと思っていました。 –

答えて

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

私はすべてのエラーを取得didntは:。!

#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 

しかし、 0であるため、szArray [3] [0] [0]を印刷できません。値を何にでも初期化したい場合は、0の代わりに "\ 0"に設定することができます。

0

もう一度やり直してください。しかし、これはいくつかの方法で行うことができます。最も単純なのは、char [25] [3]のVectorを宣言して、C++があなたのためにそれを行うようにすることです。 Vector fooのようなものを作成し、動的要素をpush_backするだけです。しかし、コンパイラがなければ、多次元配列に関してはファンキーなルールが存在するので、これはうまくいくとは100%確信していません。ベクトルのようなものでも動作させるためには、最初のパスとして配列の次元を変更する必要はありません。また、charのアプローチのベクトルのベクトルを行うことができ、3次元の動的なことができる文字のギザギザの配列を持って、これはおそらくさらにメモリ効率があります。ここにはたくさんの選択肢があります。

2

まず、あなたの質問には、charの3次元配列ではなく、charへのポインタの2次元配列があります。 Cでは、ポインタと配列は同じものではありません。

あなたの質問に答えるために、最新のC、C99で最も簡単な方法は、目的のために可変長配列VLAを使用することです。 3次元配列のためには、xyzは、あなたがその宣言を打ったときにのみ実行時に決定される変数または式です

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

にしてください。

VLAの不都合は、スタックには大きすぎないように注意しなければならないということです。個々のエントリ(ここではネストされたfor -loop)に割り当てて初期化する必要があります。文字列

char* szData[x][y]; 

の2次元配列のあなたの例で滞在した後、あなたはポインタのそれぞれに個別の文字列のいずれかを割り当てたり0にそれらを設定する必要があると思います

。あなたが動作するように動的割り当てを取得するために、これまで試みているコードのどのような

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