2

という構造体の配列を作成しようとしてStatusItemいます。これは次のようになります。

typedef struct 
{
    char* name;
    char* index;
    int optional;
} StatusItem;

また、この配列を任意のサイズにしたいので、 を使用してmallocいます。したがって、配列は次のように定義されます。

StatusItem* statusItem = NULL;

(その後、次のようにすべての値を取得する関数に渡されます。)

statusItem = (StatusItem*)malloc(cJSON_GetArraySize(items));

...

for (i = 0 ; i < cJSON_GetArraySize(items) ; i++)
{
    strcpy(statusItem[i].name,name->valuestring);
    strcpy(statusItem[i].index,index->valuestring);
    if(!parseInt(optional->valuestring, &statusItem[i].optional));
    {
         goto cleanup;
    }
}

の文字列値を取得しname、上記の変数に cJSON ライブラリを使用するコードがあり、これらの変数のフィールドに格納されます。indexoptionalvaluestring

cJSON ライブラリに関連するすべてが正常に動作し、正しい値を返すことを確認しましたが、プログラムはstatusItems配列に値にアクセスしたり格納したりできません。

何か案は?私は、それがmalloc私の側での誤用を伴うことをほぼ確信しています。

4

4 に答える 4

2

2 つの誤用が発見されました。

  1. の戻り値をキャストしないでくださいmalloc()。危険で余分です。

  2. 構造体のメンバーにメモリを割り当てません。strcpy()初期化されていないポインターを使用しているため、プログラムは未定義の動作を呼び出します。

編集:実際には3つ:

malloc(cJSON_GetArraySize(items));

は魔法ではなく、メモリのバイトを予約していることを知らないため、十分なメモリを割り当てません。したがって、安全のために、sizeof(StatusItem)割り当てサイズをsizeof(StatusItem)sizeof(*statusItem)

于 2013-06-03T19:22:27.577 に答える
0

さらに、malloc は要素ではなくバイト数を取ります。渡される値は、各要素のサイズで乗算する必要があります。

于 2013-06-03T19:24:40.547 に答える