2016-10-29 2 views
1

半固定、半動的サイズの文字列配列を初期化する方法はありますか?どうやって?半固定、半動的配列C

例:

char **p[2]; 

/*Memory allocation here*/ 

strcpy(p[0][0], "foo"); 
strcpy(p[0][1], "bar"); 
strcpy(p[1][0], "baz"); 
strcpy(p[1][1], "qux"); 
+1

はい、方法があります。 – melpomene

+0

「初期化する」と言うと、「変数定義の一部として初期化する」または「変数定義の後に複数の文でデータ構造を作成する」という意味ですか?後者はあなたが説明するものですが、Cの中で「初期化」が意味するものではありません。また、可変部分であり、固定部分です。 –

+0

@JonathanLeffler実際には変数の定義ですが、実際にはどちらか分かりません。しかし、私は初期化する方法とメモリを割り当てる方法を意味しますか?私はイムクリアを願う。 – Pareidolia

答えて

3

はい、方法があります。 C99から複合リテラルを使用して

p[0] = malloc(sizeof(char *) * 2); //Two pointers in p[0] 
p[1] = malloc(sizeof(char *) * 2); //Two pointers in p[1] 

p[0][0] = malloc(sizeof(char) * 4); //4 bytes in p[0][0] 
p[0][1] = malloc(sizeof(char) * 4); 
p[1][0] = malloc(sizeof(char) * 4); 
p[1][1] = malloc(sizeof(char) * 4); 
+1

'sizeof(char)'は定義上1です。 – melpomene

+0

はい、それは彼がタイプを変更することを決めると彼を騙してしまうかもしれません –

+1

その場合は、とにかく 'p [0] [0] = malloc(4 * sizeof * p [0] [0])'どのタイプでも動作します。 – melpomene

2

、あなたが示すように、変数pを初期化することができます

extern char **p[2]; 

char **p[2] = (char **[2]){ 
    (char *[2]){ "foo", "bar" }, 
    (char *[2]){ "baz", "qux" }, 
}; 

extern行はヘッダーに行くだろう。残りはpと定義されているソースファイルに入ります。あるいは、extern行を付けずにstatic char **p[2] = …にすることもできます。これはおそらくpがグローバル変数の名前がひどいためです。

(char **[2]){ … }は、pと同じタイプの複合リテラルです。内部には、2つの(char *[2]){ … }単位と、2 char *の配列があります。

指し示す文字列は変更できません。もし彼らが修正可能でなければならないなら、あなたは一生懸命働かなければならない(しかしそれはできます)。

このテストコードは、それが機能することを示しています

#include <stdio.h> 

int main(void) 
{ 
    for (int i = 0; i < 2; i++) 
    { 
     for (int j = 0; j < 2; j++) 
      printf("[%s]", p[i][j]); 
     putchar('\n'); 
    } 
    return 0; 
} 

出力:あなたは、実行時にあるべき二つの文字列の配列へのポインタのどのくらいの配列を決定したい場合

[foo][bar] 
[baz][qux] 

(したがって、ある時点で{ "abc", "def" }{ "pqr", "xyz" }を追加することができます)、動的メモリ割り当てを行う必要がありますが、開始する文字列の固定リストはないでしょう。あなたは(設定?)ファイルか、それと似たものからそれらを読むでしょう。

+0

神はオブジェクト指向プログラミングを祝福します。 – Pareidolia