0
struct a {
    int *val;
};

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

    n=10;

    a1->val = &n;

    func(a1);


    printf("After changing %d\n",a1->val);

}

void func(struct a *a2){
    int a = 5;
    a2->val = &a;
    a2->val = 0 ;
}

ローカル変数をメンバー構造体ポインターに割り当てました。そして最後にそれをnullにします。nullポインタを与える代わりに、それにアクセスしようとすると0を与えます。

4

1 に答える 1

0

が無効なアドレスを指しているためa1->val(19が有効なアドレスになることはめったにありません)、未定義の動作を呼び出しており、結果はすべて受け入れられます(コアダンプやその他のクラッシュを含む)。

あなたの関数がしたとしても:

*a2->val = 19;

ポインターは、関数が戻ったときに無効になった整数を指しています。関数が終了すると、ポインタを逆参照することは安全ではなくなります。新しいポインタ値を安全に割り当てることができます。ポインターを別のポインターまたはNULLと比較できます(いくつかの制約があります)。しかし、それがすべてです。

于 2012-06-14T07:10:09.413 に答える