2016-11-12 5 views
1

私はC言語のプログラミングの中で新しいものです(Javaから来ています)。正直なところ、本当に混乱します。問題に私は文字列の私の2D配列(3Dアレイのような何かを推測??)のデータの連続したチャンクを割り当てるしようとしている。私が持っているのは、これは私が配列の文字列の連続割り当てを信じているのですか? 誰かが2D配列で私を助けてくれますか?Cで文字列の連続した2次元配列を割り当てる方法

はい、私はプログラムを実行する前にサイズを知っています。そのためには行が列に、列にはCOLS、文字列にはNAMEが定義されています。

char **people = malloc(COLS * sizeof(char *)); 

people[0] = malloc(COLS * NAME); 
for(int i = 1; i < COLS; i++) 
    people[i] = people[0] + i * NAME; 
+0

あなたのコードは決してROWSを使用しません。それは意図的なのでしょうか? – ruakh

+0

このコードでは、文字列の配列に連続したデータを割り当てる必要があることは言及しておきます。 2Dではなく1D配列のために私は助けが必要な2Dのものを理解することができず、ROWSを使ったことのない理由があります。 – Pauli

+0

'char(* people)[COLS] [NAME] = malloc(ROWS * sizeof * people);'は仕事をするべきです。 – mch

答えて

1

あなたが実際にプログラムを実行する前に、配列のサイズを知っている場合、あなたは、2D静的配列を作成することができ、dinamicallyのmallocでメモリを割り当てる必要はありません。あなたの場合、それは文字列の2D配列であるため、char * array[ROWS][COLS]と宣言することができます。次に、このように特定の要素に文字列を割り当てることができます:array[nrow][ncol]="Your String"

+1

これは実際には連続していません。 OPが 'char配列[ROWS] [COLS] [NAME]'と 'strcpy(配列[nrow] [ncol]、あなたの文字列 ')'のように聞こえます。 – ruakh

+0

Sizigia申し訳ありませんが、私は連続したメモリが必要です。 Ruakh omg manありがとう私は何とかその方法を見逃しているので、私はstrcpyが不足している動的に文字列を割り当てることに巻き込まれてしまいました...良いことは、今からポインターと配列の理解がはるかに良いです:Dありがとう – Pauli

+0

通常はヒープとスタックを考えていますが、スタックのサイズ制限はヒープよりもはるかに制限されることがありますが、多くの場合、静的な割り当てが良い方法です) – ruakh

1

JavaはJavaとは異なり、実際には多次元配列の概念を持っています。あなたがchar * * *をしたい特別な理由があるのない限り、次のように記述することを好むかもしれません:

char (*people)[COLS][NAME] = malloc(ROWS * sizeof(*people)); 

ROWS動的に割り当てられた2次元文字配列の最初へのポインタであることがpeopleを設定します。

"decay"というポインタのために、配列型の式が配列の最初の要素へのポインタとして倍増する場合、peopleはあたかもchar * * *のように使用できます。たとえば、people[3][4]は、行3、列4の文字列を指します。と書くことができません。people[3][4] = ...のような文字列を突然変更します。とにかくそれをしたくないように聞こえるのですか?


注:上記は、意図的に動的メモリ割り当てを使用していることを前提としています。しかし、グローバル変数に使用されているのと同じ種類のストレージである静的メモリを使用するというSizigiaの提案を検討することをお勧めします。あなたは

static char people[ROWS][COLS][NAME]; 

ような何かを書く場合は、メモリは、プログラムの開始時に、一度だけ割り当てられ、それを宣言する機能に対するすべての呼び出しで再利用されます。

0

を使用してchar *を定義することができますので、コードを理解することをお勧めします。 、あなたは、通常の配列sintaxを使用してアクセスすることができます

typedef char * string; 
string ** people; 
people = malloc(ROWS * sizeof(string)); 
for(int i = 0; i < ROWS; i++){ 
    people[i] = malloc(COLUMNS * sizeof(char)); 
} 

:次に、あなたがしなければならないすべては、動的に定義された型の2次元配列を割り当てることである(以下の例では、私が「文字列」として定義されます) people[i][j]

関連する問題