初期化されていないポインターがあり、誤ってそれを解放しようとした場合、未定義の動作が発生しますか?
お気に入り:
int main(void){
char *string;
free(string);
return 0;
}
初期化されていないポインターを解放すると、未定義の動作が発生しますか?
はい。
ただし、NULL ポインターの解放は明確に定義されています。
C99 標準から:
この
free
関数は、 が指すスペースのptr
割り当てを解除します。つまり、さらに割り当てられるようにします。ptr
がヌル ポインターの場合、アクションは発生しません。calloc
それ以外の場合、引数が、malloc
、または 関数によって以前に返されたポインターと一致しない場合、またはrealloc
の呼び出しによってスペースが割り当て解除された場合、動作は undefinedです。free
realloc
はい、初期化されていない変数にアクセスすると、未定義の動作が引き起こされるためです。
これには、初期化解除ポインタを に渡すことが含まれますfree()
。これ自体には、「偶然に」非初期化ポインタが に等しい値を持つ場合も含まれますNULL
。
はい、未定義の動作です。
に渡されるポインタは、 、、または null ポインタでfree
割り当てられた有効なオブジェクトへのポインタである必要があります。malloc
calloc
realloc
C99 から:
(7.20.3.2p2) 「ptr が null ポインターの場合、アクションは発生しません。それ以外の場合、引数が calloc、malloc、または realloc 関数によって以前に返されたポインターと一致しない場合、またはスペースが呼び出しによって割り当て解除された場合解放または再割り当てする場合、動作は未定義です。」
はい、そうです。 1. または 2. への呼び出しを介して取得したポインタのみを使用する必要があるためfree()
です。NULL
malloc()
calloc()
realloc()