- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
#include <iostream>
int *sfirst_function(void);
int *isecond_function(void);
int * sfirst_function(void)
{
int ilocal_to_first=11;
return &ilocal_to_first; // Возвращаем указатель на переменную, размещенную в стеке
}
int *isecond_function(void)
{
int ilocal_to_second=44;
return &ilocal_to_second; // ну и тут
}
void main()
{
int *pi=sfirst_function();
printf("First Function = %d\n",*pi);
int *si= isecond_function();
printf("Second Function = %d\n",*si);
}
guest 18.02.2010 22:25 # +2.2
guest 18.02.2010 23:55 # +1
guest 18.02.2010 23:59 # +4.2
Закроем глаза на использование iostream в си.
RankoR 19.02.2010 00:01 # 0
guest 21.02.2010 01:21 # −2
Где здесь Си?
Нет. :)
guest 21.02.2010 01:21 # −2
RankoR 21.02.2010 22:35 # 0
guest 21.02.2010 23:58 # −1
Вот когда в це будет iostream, тогда и приходите. А от того, что автор той темы не разбирается в том, на чём код - це, це-минус-минус, питон, труболисп для макинтош — не изменится ровным счётом ничего.
Ну а потом — таки да, переписали под универсальный вариант.
guest 22.02.2010 16:11 # 0
guest 19.02.2010 08:55 # +2
Возвращаясь к нашим баранам. Это, вроде как, вполне клинический случай, но особым говнокодом и не пахнет. Тем не менее, гораздо красивее и тоньше, нежели все эти if ( (a==b)? true : false), которые форсятся школотой. Плюсую, за идею.
guest 21.02.2010 01:20 # +1
if ( (a=b)? true : false)
guest 21.02.2010 12:10 # 0
guest 19.02.2010 14:26 # 0
guest 19.02.2010 18:53 # +3
Параграф:
Функции, возвращающие адреса
Когда функция возвращает указатель или ссылку, результатом выполнения функции
становится адрес в памяти компьютера. Пользователь может прочитать значение,
сохраненное по этому адресу, и даже, если указатель не был объявлен со спецификатором
const, записать туда свои данные. Это может привести к возникновению трудно
обнаруживаемых ошибок в программах. Посмотрим, сможете ли вы разобраться в том, что
происходит в следующей программе.
Этим объясняется и iostream, и бредовость идеи. Логически рассуждая можно сделать вывод, что некий преподаватель решил выдать школотестудиозусам "хитровыебанную задачу", спросив, а что тут не так. Посему, человек и ткнулся на отнечад. Посему мы и наблюдаем сугубо учебный пример.
Вывод - не говнокод.
RankoR 19.02.2010 22:50 # 0
Если человек так поступил в маленьком проекте - следовательно, не задумавшись сделает так же и в большом
guest 20.02.2010 11:22 # 0
С какого количества строк проект считается крупным?
guest 20.02.2010 15:13 # −6
guest 21.02.2010 01:23 # 0
guest 21.02.2010 16:01 # 0
RankoR 20.02.2010 21:08 # −1
Крупный - понятие относительное. БОЛЕЕ крупный - хотя бы строк 200 (этого будет вполне достаточно, чтобы показать, что код неработочпособен). А вот если кода будет over 50k, то уже пензес, в жизни не найдешь, где ошибка.
guest 20.02.2010 22:25 # +1
Обращу Ваше внимание, что я нашёл топик на онтечаде, и там не было ни слова про то, что код рабочий. Один человек спросил, почему его вариант кода не компилируется (лишняя точка с запятой), его вариант был точной копипастой из "Visual C++ 6 Руководство разработчика", только текст был транслитом. Другой исправил и запостил, в том же самом виде. Третий оставил декларацию iostream, но переписал на printf.
Прозреваю, что задание на лабу было разобраться, почему так кодить нельзя.
Все эти Ваши домыслы, что код рабочий, совершенно неуместны. Это демонстрация, криво переписанная и похабно разъяснённая. Ололо?
ISith 22.02.2010 21:07 # 0
ISith 22.02.2010 21:24 # +1
ISith 22.02.2010 21:23 # 0
перед вызовом первой функции:
.... <----- несколько двордов
1 dword
2 dword
3 dword
4 dword <----esp
потом, перед возвратом из функции:
.... <----- несколько двордов == saved registers
1 dword <----local var
2 dword <----ebp
3 dword <----ret address
4 dword
Т.е. мы получаем адрес нашей локальной переменной 1., и во время вызова принтфа, перед тем, как испортить значение в стеке адресом возврата, мы получаем его и передаем в принтф. Кстати, если бы параметров принтфу было побольше, то с некоторой вероятность значение по адресу pi вычислялось после того, как в стек засунуты 3 параметра и было равно значению третьего параметра, если ниче не напутал. Вод =)
guest 25.02.2010 20:15 # 0