История изменений
Исправление alysnix, (текущая версия) :
Смотрел ролики на ютубе у них программа вылетала. Правда там на виндовс было. Ожидал тоже сегметацию увидеть. А она спокойно отработала.
не будет никакой сегментации. в данном случае a() вернула адрес со стека. из своего фрейма. поскольку стек является легальным сегментом для чтения записи, то и читать этот адрес и писать по нему - легально. и поскольку никаких других функций после a() не вызывалось, то там так и лежит число 25. попробуй после a() вызвать такую же aa(), но читать по адресу взятому из a():
int* a(){
int x= 25;
return &x;
}
int* aa(){
int x= 77;
return &x;
}
int main(){
int* x = a();
aa(); //просто вызвали
int b = *x;
printf("%d\n",b); //получишь 77
}
почему легально вернуть адрес такой переменной? потому что ты таким образом узнал адрес на стеке. а для системного программирования это может быть важным.
Исходная версия alysnix, :
Смотрел ролики на ютубе у них программа вылетала. Правда там на виндовс было. Ожидал тоже сегметацию увидеть. А она спокойно отработала.
не будет никакой сегментации. в данном случае a() вернула адрес со стека. из своего фрейма. поскольку стек является легальным сегментом для чтения записи, то и читать этот адрес и писать по нему - легально. и поскольку никаких других функций после a() не вызывалось, то там так и лежит число 25. попробуй после a() вызвать такую же aa(), но читать по адресу взятому из a():
int* a(){
int x= 25;
return &x;
}
int* aa(){
int x= 77;
return &x;
}
int main(){
int* x = a();
aa(); //просто вызвали
int b = *x;
printf("%d\n",b); //получишь 77
}