LINUX.ORG.RU

Почему тут нет ошибки?

 


0

1
int* a();

int main(){

int* x = a();
int b = *x;
printf("%d\n",b);

}

int* a(){

int x= 25;
return &x;

}

Смотрел ролики на ютубе у них программа вылетала. Правда там на виндовс было. Ожидал тоже сегметацию увидеть. А она спокойно отработала.

Перемещено leave из general

★★

Последнее исправление: tyamur (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

А потом пишут, дескать, Си не плохой,

причем тут си? он для того и предназначен, чтобы на асме не писать. а когда возвращаешь адрес локального обьекта - надо понимать, что делаешь. можно в любом языке написать бесконечный loop, или разделить на ноль. сдуру можно у буй сломать.

alysnix ★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Компилятор твой друган.

Причём один из немногих друзей, который никогда не предаст, если внимательно читать то что он говорит.

bonta ★★★★★
()
Ответ на: комментарий от alysnix

почему кто-то думает, что легально вернуть адрес такой переменной?

fixed. Потому что стандарты знать не хочет, пишет под конкретный компилятор конкретной версии с конкретными флагами.

anonymous
()
Ответ на: комментарий от anonymous

Я боюсь допустить но... ты сомневаешься что можно взять указатель на локальную фунцию?
Либо код приводи, либо не засоряй тред.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Посмотри ассемблерный выхлоп функции main, даже если не знаешь ассемблера, там есть всплывающие подсказки:

Интересно.

То есть компилятор оптимизировал функцию так, что она всегда возвращает ноль. Странно, конечно, по логике бы вообще функцию нужно убрать. Но пути компилятора неисповедимы.

Ок, объясняет.

Kroz ★★★★★
()
Ответ на: комментарий от anonymous

gcc -Wall -Wextra

и гсс и цланг дадут варнинг о возврате адреса локальной переменной. соотвественно -Werror любой варнинг сделает ошибкой.

alysnix ★★★
()

Блин, да что ж за проклятье висит над C. Один его по ютубу учит, другой по ассемблерным выхлопам, третий по geeksforgeeks, и никто по-нормальному. А потом космические корабли врезаются в Большой театр.

anonymous
()
Ответ на: комментарий от anonymous

и никто по-нормальному.

По-нормальному это по книжкам с учебными примерами? В реале задачи всё равно сложнее, чем те, что из умных книжек.

RedEyedMan666
()
Ответ на: комментарий от RedEyedMan666

Даже если я учу сишкоплюсы по книжкам, никто не возьмет меня в джуниоры, посмеются над моим примитивным кодом (построенным по принципу учебных примеров) и всё. Так что учиться надо любым способом, но так чтобы этот способ понятно объяснял контекст.

RedEyedMan666
()
Ответ на: комментарий от RedEyedMan666

А ты не путай изучение языка и изучение реальных задач. Одно другому не противоречит.

anonymous
()
Ответ на: комментарий от Kroz

не мои размышления . нарыл.

чтобы разобраться что тут происходит надо понять в чем отличия указателя от ссылки.

при дисассемблировании люди увидели что ссылка отличается от указателя лишь одной строчкой, и это строчка разыменовывание. то есть ссылка-это указатель который сразу же разыменовывается.

что нарыл об этом.

 void(*p)()=foo; void(*p)()=&foo;

для компилятора foo это всего лишь адрес. 0xffff, как пример.

при компиляции не будет foo , будет 0xffff.

и когда мы пишем

 void(*p)()=foo;

или void(*p)()=&foo;

при компиляции будет все одно и это значит void(*p)()=0xffff; void(*p)()=&0xffff;

то есть тут мы

void(*p)()=&0xffff;

вот этим вот &0xffff ничего не делаем. &0xffff == 0xffff

Assembler
()
Ответ на: комментарий от anonymous

мне очень нравится СИ. научи пожалуйста , как его правильно учить

Assembler
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.