1. ホーム
  2. c

[解決済み] 解放されるポインタが割り当てられていなかった」とは、具体的にはどういう意味ですか?

2022-02-11 04:04:28

質問

文字列をコピーした後、構造体文字列変数にコピーされた一時的な文字列変数を解放しようとしているのですが、問題があります。しかし、文字列を解放しようとすると、プログラムが「解放されるポインタが割り当てられていません」と言い出します。何が起こっているのか正確に理解できません。

char str[]="       ";           //temporary string to copy to structs string
str[3]=s;                       //putting a char s in middle
strcpy(matrix[i-1][j].c, str);  //copying the string
free(str);                      //freeing str that now is useless when copied

解決方法は?

の呼び出しによって返されるポインタのみが malloc() , realloc() または calloc() に渡すことができます。 free() (ヒープ上に動的に確保されたメモリ)。セクションから 7.20.3.2 フリー関数 C99規格の

free関数は,ptrが指す領域を解放します. をさらに割り当てることができます。ptr が NULL ポインタの場合、何も起こりません。 そうでない場合は 引数が calloc, malloc, realloc 関数が先に返したポインタと一致しない場合、あるいは free や realloc の呼び出しによって空間が解放された場合。 の動作は未定義です。

投稿されたコードでは str は動的に確保されるのではなく、スタック上に確保され、スコープ外に出た時点で自動的に解放されるようになっており、わざわざ free() d.