LINUX.ORG.RU

История изменений

Исправление 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
}