Адрес локальной переменной присваивается указателю члена в структуре

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 ;
}

Назначенная локальная переменная указателю структуры члена. и, наконец, сделать его нулевым. вместо нулевого указателя он дает 0, когда пытался получить к нему доступ.

1 ответ

Решение

Поскольку a1->val указывает на неверный адрес (19 очень редко является действительным адресом), вы вызываете неопределенное поведение, и любой результат является приемлемым (включая дамп ядра или другой сбой).

Даже если ваша функция сделала:

*a2->val = 19;

указатель будет указывать на целое число, которое больше не будет действительным, когда функция вернется. Как только функция завершена, переопределение указателя перестает быть безопасным; вы можете смело назначать ему новое значение указателя; вы можете сравнить указатель с другим указателем или NULL (с ​​учетом некоторых ограничений); но это все

Другие вопросы по тегам