3

初期化されていないポインターがあり、誤ってそれを解放しようとした場合、未定義の動作が発生しますか?

お気に入り:

int main(void){

    char *string;
    free(string);

    return 0;
}
4

4 に答える 4

5

初期化されていないポインターを解放すると、未定義の動作が発生しますか?

はい。

ただし、NULL ポインターの解放は明確に定義されています。

C99 標準から:

このfree関数は、 が指すスペースのptr割り当てを解除します。つまり、さらに割り当てられるようにします。ptrがヌル ポインターの場合、アクションは発生しません。callocそれ以外の場合、引数が、malloc、または 関数によって以前に返されたポインターと一致しない場合、またはreallocの呼び出しによってスペースが割り当て解除された場合、動作は undefinedです。freerealloc

于 2013-08-10T09:59:20.047 に答える
2

はい、初期化されていない変数にアクセスすると、未定義の動作が引き起こされるためです

これには、初期化解除ポインタを に渡すことが含まれますfree()。これ自体には、「偶然に」非初期化ポインタが に等しい値を持つ場合も含まれますNULL

于 2013-08-10T10:36:55.837 に答える
1

はい、未定義の動作です。

に渡されるポインタは、 、、または null ポインタでfree割り当てられた有効なオブジェクトへのポインタである必要があります。malloccallocrealloc

C99 から:

(7.20.3.2p2) 「ptr が null ポインターの場合、アクションは発生しません。それ以外の場合、引数が calloc、malloc、または realloc 関数によって以前に返されたポインターと一致しない場合、またはスペースが呼び出しによって割り当て解除された場合解放または再割り当てする場合、動作は未定義です。」

于 2013-08-10T09:59:24.333 に答える
0

はい、そうです。 1. または 2. への呼び出しを介して取得したポインタのみを使用する必要があるためfree()です。NULLmalloc()calloc()realloc()

于 2013-08-10T09:59:39.340 に答える