1. ホーム
  2. スクリプト・コラム
  3. その他

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

2021-12-30 10:58:36

質問

C言語を使って、構造化文字列変数に文字列をコピーしているのですが、文字列を解放すると、次のようなエラーが報告されます。

pointer being freed was not allocated

以下のようなコードです。

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 がヌルポインタの場合は何も起こりません. それ以外の場合、引数が calloc, malloc, realloc 関数によって先に返されたポインタと一致しない場合、あるいは free や realloc の呼び出しによって領域が解放された場合、その動作は未定義です。

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