0
typedef struct ArrayList
{
    // We will store an array of strings (i.e., an array of char arrays)
    char **array;

    // Size of list (i.e., number of elements that have been added to the array)
    int size;

    // Length of the array (i.e., the array's current maximum capacity)
    int capacity;

} ArrayList;

次の関数は、構造体を含むヘッダー ファイルでサポートされる文字列の配列に動的にメモリを割り当てることになっています (上記を参照)。

void panic(char *s)
{
    fprintf(stderr, "%s", s);
    exit(1);
}

ArrayList *createArrayList(int length){
    ArrayList *n = malloc(sizeof(ArrayList));

    int initial = 0, i;

    if (length > DEFAULT_INIT_LEN)
    {
        n->array = (char **)malloc(length * sizeof(int*));
        n->capacity = length;

        for (i = 0; i< n->capacity; i++)
        {
            n->array[i] = NULL;
        }
    }
    else
    {
        n->array = (char **)malloc(DEFAULT_INIT_LEN * sizeof(int*));
        n->capacity = DEFAULT_INIT_LEN;

        for (i = 0; i< n->capacity; i++)
        {
            n->array[i] = NULL;
        }
    }

    if (n->array == NULL)
        panic("ERROR: out of memory in Mylist!\n");

    n->size = initial;

    printf("-> Created new ArrayList of size %d\n", n->capacity);
    return n;
}

次に、 createArrayList 関数によって作成された、新しく割り当てられた配列に現在含まれているすべての文字列を出力する別の関数があります。

void printArrayList(ArrayList *list)
{
    int i;

    for(i=0; i<list->capacity; i++)
    {
        if (list->array[i] == NULL)
            printf("(empty list)\n");
        else
            printf("%s\n",list->array[i]);

    }
}

メイン関数に printArrayList 関数 (上記) を実装すると、出力は次のようになります。

-> Created ArrayList of size 10 
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)

ただし、strcpy(n->array[1], "apple");文字列を保持する 2D 配列の機能をテストする手段として createArrayList 関数を挿入すると、出力は次のようになります。

-> Created ArrayList of size 10 

...そして、クラッシュします

だから私の質問は、私が間違っていることは何ですか? アレイにメモリを間違って割り当てていますか? 私はそれを取得したいので、出力は次のとおりです。

-> Created ArrayList of size 10 
(empty list)
apple
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
(empty list)
4

2 に答える 2

1

にメモリを割り当てるだけでなくArrayList、各文字列にストレージを割り当てる必要もあります。配列の2番目の要素を設定したい場合は、次のようなものを使用してこれを行うことができます

void insert_at(ArrayList* arraylist, const char* str, int index)
{
    arraylist->array[index] = malloc(strlen(str)+1);
    if (arraylist->array[index] != NULL) {
        strcpy(arraylist->array[index], str);
    }
}

そしてそれを次のように呼び出します

insert_at(n, 1, "apple");

余談ですが、あなたのコードは

n->array = (char **)malloc(length * sizeof(int*));

する必要があります

n->array = malloc(length * sizeof(char*));

(それはポインターの配列ではcharなく、Cintからの戻り値をキャストするべきではありません)malloc

于 2013-05-27T18:59:55.217 に答える
0

3つの問題

1) 小:変化

n->array = (char **)malloc(length * sizeof(int*));

n->array = (char **)malloc(length * sizeof(char*));

2)直接のテストをif (n->array == NULL)後に置きますn->array = (char **)malloc(...

n->array = (char **)malloc(DEFAULT_INIT_LEN * sizeof(int*));
if (n->array == NULL)
   panic("ERROR: out of memory in Mylist!\n");

3) 最も重要。strcpy(n->array[1], "apple");最初にメモリを割り当てないとできませんn->array[1]。何かのようなもの

n->array[1] = malloc(strlen("Fred")+1);
strcpy(n->array[1], "Fred");
于 2013-05-27T19:05:21.613 に答える