331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
||||||
1 | ||||||
Простая и интересная задачка по C++: объяснить почему результат работы программы именно такой, какой он есть26.02.2017, 18:53. Показов 713. Ответов 8
Метки нет (Все метки)
Всем привет, я сам ещё новичок в C++(< 2 лет изучаю), но уже что-то понимаю и решил сделать задачу на основы языка для совсем зелёных, для решения из C++ вам нужно будет знать функции, cout и указатели.
Итак, задача: Дан следующий код:
1 Почему выводится secret function 42, если вызывается только printHelloWorld(); 2 Откуда взялось число 42? Подсказки: 1 Не потому что 42 - это ответ на «главный вопрос Жизни, Вселенной и Всего Остального» 2 На других архитектурах и компиляторах результат может быть другим, я компилил в linux gcc 5.4.0 x64 P.S. Если не верите, можете убедиться сами https://www.tutorialspoint.com... TliUXRqc1U
0
|
26.02.2017, 18:53 | |
Ответы с готовыми решениями:
8
Объяснить результат работы программы Почему такой результат работы функции? Почему результат работы многопоточного кода такой? Почему javascript такой какой он есть? |
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
|
26.02.2017, 19:56 | 2 |
1.
Кликните здесь для просмотра всего текста
если я правильно понял, то тут идёт работа со стеком вызовов, но могу и ошибаться. было бы интересно узнать правильный ответ (разъяснение), ибо возможности пошагово протестировать данный код сейчас нет.
2. Кликните здесь для просмотра всего текста
42 выводится, т.к. переменной var присваивается 052, что есть 42 в восьмиричной системе счисления
0
|
56 / 56 / 31
Регистрация: 24.10.2016
Сообщений: 186
|
|
26.02.2017, 20:18 | 3 |
Все это зависит от платформы и компилятора и никак не описывается стандартом C++. Например в mingw32 я получил SIGSEGV. Так что вопрос абсолютно никак не касается знания C++, а скорее знаний конкретного компилятора и abi, который он применяет для данной платформы.
0
|
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
||||||
26.02.2017, 20:55 [ТС] | 4 | |||||
Кликните здесь для просмотра всего текста
Да, работа со стеком программы, при вызове любой функции, сначала в стек помещаются параметры(в моём случае отсутствуют), затем в стек помещается адрес возврата(8 байт при 64 битной адресации памяти), затем происходит вызов функции printHelloWorld, по сути переход по адресу этой функции, внутри которой 8 байт на стеке резервируются под хранение регистра esp(подробнее об этом можно почитать в книгах по ассемблеру) и ещё сколько-то байт, у меня 16 под локальные переменные(компилятор может добавлять свой код, в моём случае он так и сделал). С помощью
С 42 примерно тоже, поскольку переменные на стеке не зануляются и всё выделение памяти под локальные переменные сводится к изменению вершины стека, можно вычислить, где будет находиться var из func1 после вызова и записать туда 42, если за это время никто не запишет туда ничего другого(нарпимер инициализация переменной var может всё поломать), то cout выведет 42. Но, как написал, OlafNestandart, это больше на знание архитектуры современных ПК и в некоторых случаях компилятор может делать не так, как я написал выше, например, параметры функции могут передаваться не через стек, а через регистры(память процессора).
1
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
26.02.2017, 21:49 | 5 |
DevAlone,
Потому что говнокод и UB
2
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
26.02.2017, 22:13 | 6 |
0
|
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
|
26.02.2017, 22:25 [ТС] | 7 |
Я ж написал, что в других компиляторах и на других платформах результат может быть другой, и я там приложил ссылку, где работает. Так, на всякий случай: пример искусственный и писать такое в продакшн не стоит ни в коем случае.
0
|
15 / 15 / 8
Регистрация: 30.03.2014
Сообщений: 75
|
||||||
27.02.2017, 01:02 | 8 | |||||
0
|
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
|
27.02.2017, 01:49 [ТС] | 9 |
Работает, Hello, World и secret function 42 пишет, а после этого сегфолт из-за того, что func1 была "вызвана" неправильно и адрес возврата неправильный, там находится что-то из стека, он пытается туда перейти, но ос не разрешает.
0
|
27.02.2017, 01:49 | |
27.02.2017, 01:49 | |
Помогаю со студенческими работами здесь
9
Какой результат работы этой программы? Перенаправление на другой web-server (задачка простая, но не пойму как это гуглу объяснить)) Как результат работы программы (например какой-нибудь текст) опубликовать на форуме Найти ошибки и исправить их, проанализировать полученные результаты и объяснить, почему они именно такие можете объяснить все включая, то почему там такой step Почему такой результат Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |