1

realloc 関数を使用して、入力文字を動的配列に格納しようとしています。使用後にメモリを解放するために free メソッドを呼び出さずに使用すると、すべてがうまくいきます。しかし、フリーメソッドで使用するとランタイムエラーが発生します。これが私のコードスニペットです。

int main(){  
char *message ;  
int len = 0 ;
char c ;  
while((c=getchar()) != '\n'){  
    message = realloc(message,(len+1)*sizeof(char)) ;  
    message[len++] = c ;  
}     
message = realloc(message, (len+1)* sizeof(char));  
message[len]='\0' ;  
printf("Message is %s\n",message);  
free(message) ;  
return 0 ;  
}  

誰でもこれを理解できますか。両方の方法を一緒に使用する必要があるため..ありがとう!!!!

4

1 に答える 1

1

あなたが見ている問題を引き起こしていないかもしれませんが、X = realloc(X, newsize);爆発するのを待っている時限爆弾です。realloc要求した新しいチャンクの割り当てに失敗した場合、nullポインターを返し、既存のデータを変更しないままにすることができます。そうすると、既存のポインタがNULLで上書きされ、以前に割り当てたメモリがリークします(さらに割り当てることができなくなります)。

おそらく問題は発生していませんが、realloc一度に1文字ずつ割り当てを増やすために使用することは(強く)お勧めしません。それはひどく非効率的です。たとえば、32文字または64文字のブロックから始めて、スペースが不足するたびに、割り当てを何らかの係数(たとえば、1.5)ずつ増やします。このようにして、reallocを大量に呼び出すことなく、大幅に異なる長さの入力を処理できます。

編集:それを見ると、本当の問題はおそらく、への最初の呼び出しの前にポインタを適切に初期化していないことですrealloc。NULLポインター以外のものを渡すと、渡したものがmalloc/callocまたはの前の呼び出しから取得した有効なポインターであることが期待されreallocます。

int main(){  
char *message ;  
int len = 0 ;
char c ;  
while((c=getchar()) != '\n'){  
    message = realloc(message,(len+1)*sizeof(char)) ;  
    message[len++] = c ;  
}     
message = realloc(message, (len+1)* sizeof(char));  
message[len]='\0' ;  
printf("Message is %s\n",message);  
free(message) ;  
return 0 ;  
}  

少なくとも私にとっては、これはエラーメッセージなしで実行されます。

于 2012-06-21T23:32:11.077 に答える