Cで多次元配列を渡す
-
05-07-2019 - |
質問
現在、Cを学習しようとしていますが、解決できない問題に遭遇しました。
検討:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ELEMENTS 5
void make(char **array, int *array_size) {
int i;
char *t = "Hello, World!";
array = malloc(ELEMENTS * sizeof(char *));
for (i = 0; i < ELEMENTS; ++i) {
array[i] = malloc(strlen(t) + 1 * sizeof(char));
array[i] = strdup(t);
}
}
int main(int argc, char **argv) {
char **array;
int size;
int i;
make(array, &size);
for (i = 0; i < size; ++i) {
printf("%s\n", array[i]);
}
return 0;
}
なぜ上記の方法で配列を作成した後、配列の内容を読み戻せないのかわかりません。文字通り、失敗する理由を理解しようとして1時間を費やしましたが、手ぶらで現れました。間違いなく些細なことです。
乾杯、
解決
作業コードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ELEMENTS 5
void make(char ***array) {
char *t = "Hello, World!";
*array = malloc(ELEMENTS * sizeof(char *));
int i;
for (i = 0; i < ELEMENTS; ++i) {
(*array)[i] = strdup(t);
}
}
int main(int argc, char **argv) {
char **array;
make(&array);
int i;
for (i = 0; i < ELEMENTS; ++i) {
printf("%s\n", array[i]);
free(array[i]);
}
free(array);
return 0;
}
他の人が投稿したように-未使用のサイズがあり、strdupはそれ自体でメモリを割り当てます。その後、メモリを解放するのは良いことです...
他のヒント
&quot; array&quot;のアドレスを渡す必要があります。関数に。つまり、char ***が必要です。これは、メモリを割り当てて配列の値を変更する必要があるためです。
編集:より完全にするには、関数宣言で次のようなものが必要です
void make(char ***array, int *array_size)
その後、次を使用して呼び出す必要があります
make(&array, &size);
関数 make 内で、メモリを割り当てます
*array = malloc(ELEMENTS * sizeof(char *));
それに応じて他の場所を変更します。
また、kauppiが指摘したように、strdupはメモリを割り当てますので、各文字列に対してmallocを実行する必要はありません。
絶対に注目されるPolyThinkerのコメントを参照してください。
配列を渡す方法に加えて、他のいくつかの問題を確認する必要があります。
- おそらくmake(...)でarray_sizeに何かを割り当てる必要がありますか?
- strdup(char *)はメモリを割り当てます。array[i]のmallocは不要です。
- 不要になったら、割り当てたメモリをすべて解放する必要があります。
配列の current 値を渡して、コピー(スタック上)として作成します。 make()で配列を変更すると、実際の変数ではなく、コピーのみが変更されます。 &amp;で参照渡しするか、char ***にして* array = ...
で動作させますsizeは宣言されていますが、値が割り当てられていません(関数makeで発生するはずです)。
所属していません StackOverflow