1

char* を含む配列 user_input があります。ここで、この配列のサイズは、次のコードによって実行時に決定されます。

char** user_input;
user_input = (char**)malloc(get_size());

これで、user_input の各インデックスには、関数 parse_index(int) から受け取った動的に割り当てられた文字配列へのポインターが含まれます。

for(int i=0;i<SIZE;i++){
   user_input[i]=parse_index[i];       //parse_index makes a call to malloc
}

完了したら、次のコードを使用してヒープ上のすべてのメモリの割り当てを解除します。

//to deallocate the character arrays
for(int i=0;i<SIZE;i++){
   free(user_input[i])      
}
//to deallocate the char*
free(user_input)

しかし、2回目の呼び出しでプログラムがクラッシュします..誰かが私が間違っていることを説明できますか?

4

2 に答える 2

0

この問題は解決されました。sizeof(char*) でサイズを乗算しない間違った関数を呼び出していました。

于 2013-03-03T03:30:39.807 に答える
0

get_size()適切な値を返す限り、ループSIZEがユーザー入力のサイズ (またはそれ以下) まで上がり (両方とも同じになります!)、parse_index[i]十分なmalloc(3)ed メモリが含まれている限り、これは問題ないように見えます。free(3)他の場所で編集します。

問題を診断するには、さらに多くのプログラムが必要です。データ構造にまったく関係のない何かが走り書きされている可能性もあります...単純化されたバージョンが同じようにクラッシュする限り、プログラムを単純化してここに表示しても問題ありません。

最大の警告でコンパイルし、それぞれを探し出して修正するか (コンパイラーが間違っていると考えていることを理解し、黙ってはいけません)、コンパイラーが混乱しているか、不完全なデータを処理していることを確認してください。デバッガーでプログラムを実行し、クラッシュさせます。どこで/なぜ/どのように見つけます。プログラムをvalgrindなどで実行して、メモリ処理の不一致の可能性を診断します。

ところで、キャストするのは悪い考えでありmalloc(3)、必要ではなく、バグを隠す可能性があります。

于 2013-03-03T02:50:30.720 に答える