質問

現在、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のコメントを参照してください。

配列を渡す方法に加えて、他のいくつかの問題を確認する必要があります。

  1. おそらくmake(...)でarray_sizeに何かを割り当てる必要がありますか?
  2. strdup(char *)はメモリを割り当てます。array[i]のmallocは不要です。
  3. 不要になったら、割り当てたメモリをすべて解放する必要があります。

配列の current 値を渡して、コピー(スタック上)として作成します。 make()で配列を変更すると、実際の変数ではなく、コピーのみが変更されます。 &amp;で参照渡しするか、char ***にして* array = ...

で動作させます

sizeは宣言されていますが、値が割り当てられていません(関数makeで発生するはずです)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top