1
typedef struct {
    char * array[10];
} List;

int main(void) {
    List input;
    input.array = (char **)malloc(10 * sizeof(char));
    if (input.array == NULL)
        exit(EXIT_FAILURE);

    for (i = 0; i < 10; i++) {
        input.array[i] = (char *)malloc(10 * sizeof(char));
        if (input.array[i] == NULL)
            exit(EXIT_FAILURE);
    }
}

それぞれが長さ 10 の異なる文字列を指す 10 個の char ポインターの配列を初期化しようとしています。

gcc から次のエラーが表示されます。

incompatible types when assigning to type ‘char *[10]’ from type ‘char **’

私の malloc への呼び出しは正しくないはずですが、どうしてですか?

4

2 に答える 2

8

char *array[10]への 10 個のポインターの配列を宣言しcharます。mallocこのアレイを格納する必要はありません。に埋め込まれていstruct Listます。したがって、 の最初の呼び出しmallocは不要であり、直後のチェックも不要です。

mallocループ内への呼び出しと、その後のチェックは正しいです。

また、C では、の戻り値をキャストしないmallocでください。実際にバグを隠すことができます。

また、定義上sizeof(char)1であるため、絶対に記述しないでください。

struct List
{
    char *array[10];
};

int
main(void)
{
    struct List input;
    for (int i = 0; i < 10; i++)
    {
        input.array[i] = malloc(10);
        if (!input.array[i])
            return EXIT_FAILURE;
    }
    /* presumably more code here */
    return 0;
}
于 2013-07-10T18:24:56.800 に答える
0

malloc(10 * sizeof(char*));

10文字(1バイト)ではなく、10文字ポインタ(4バイト/ 8バイト)を割り当てる必要があります

//編集: 構造体を無視しました。最初の malloc は必要ありません。他の回答を参照してください。

于 2013-07-10T18:25:42.970 に答える