2

私は現在 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時間費やしましたが、手ぶらで出てきました。些細なことであることは間違いありません。

乾杯、

4

5 に答える 5

6

「配列」のアドレスを関数に渡す必要があります。つまり、char *** が必要です。これは、メモリを割り当てて配列の値を変更する必要があるためです。

編集:より完全にするために、関数宣言で次のようなものが必要です

void make(char ***array, int *array_size)

次に、を使用して呼び出す必要があります

make(&array, &size);

関数make内で、メモリを割り当てます

*array = malloc(ELEMENTS * sizeof(char *));

それに応じて他の場所を変更します。

また、kauppi が指摘したように、strdup がメモリを割り当ててくれるので、文字列ごとに malloc を実行する必要はありません。

于 2009-01-08T08:00:42.310 に答える
5

作業コードは次のとおりです。

#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 はそれ自体でメモリを割り当てます。後でメモリを解放すると便利です...

于 2009-01-08T08:09:21.417 に答える
4

PolyThinker のコメントを参照してください。

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

  1. おそらく、make(...) で array_size に何かを割り当てる必要がありますか?
  2. strdup(char*) はメモリを割り当てます。array[i] の malloc は必要ありません。
  3. 必要がなくなったら、割り当てたすべてのメモリを解放する必要があります。
于 2009-01-08T07:59:50.813 に答える
3

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

于 2009-01-08T08:05:25.140 に答える
0

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

于 2009-01-08T08:04:50.897 に答える