3
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *a = malloc(sizeof(int));

    __extension__ void clean(void)
    {
        free(a);
    }

    atexit(clean);
    return 0;
}

aネストされた関数内に表示されますが、セグメンテーション違反の原因は何ですか?

4

1 に答える 1

3

gcc のドキュメントから:

含まれている関数が終了した後で、ネストされた関数をそのアドレスを介して呼び出そうとすると、すべての地獄が解き放たれます。含まれているスコープ レベルが終了した後で呼び出しを試み、スコープ内にない変数の一部を参照する場合は、幸運かもしれませんが、リスクを冒すのは賢明ではありません。ただし、ネストされた関数が範囲外のものを参照していない場合は安全です。

atexit登録された関数はmain終了後に呼び出されます。

于 2014-07-24T12:08:26.187 に答える