Адрес локальной переменной присваивается указателю члена в структуре
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 (с учетом некоторых ограничений); но это все