1

文字配列が作成され、メモリが動的に割り当てられるこのプログラムを実行しようとしています。その後、配列要素には、連続する 10 か所の文字列「hello」が入力されます。値は、strdup() 関数呼び出しを使用して文字列要素に割り当てられます。

すべての要素が割り当てられると、while ループで要素が解放されます。Visual Studio でプログラムを実行すると、char 配列への最後のポインターが解放された後にプログラムがクラッシュします。while ループの終了条件は正しいと思います。しかし、問題の原因を正確に特定することはできません。

コード:

char **p;
int i;

p = malloc(10 * sizeof(char *));
for (i = 0; i < 10; i++) {
    p[i] = strdup(“hello”);
}

while (*p) {
 free(*p++);
}
4

3 に答える 3

4

while ループを使用したい場合は、次のようにコードを記述する必要があります。

char **p;
int i;

p = malloc(11 * sizeof(char *));
for (i = 0; i < 10; i++) {
    p[i] = strdup(“hello”);
}

p[i] = NULL;

while (*p) {
 free(*p++);
}

p 自体の初期値も解放する必要があることを考慮してください。したがって、while ループを含む正しいコードは次のようになります。

char **p;
int i;

p = malloc(11 * sizeof(char *));
for (i = 0; i < 10; i++) {
    p[i] = strdup(“hello”);
}

p[i] = NULL;

char **q = p;

while (*q) {
 free(*q++);
}

free( p );
于 2014-10-07T06:46:37.910 に答える