Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

[c++]Странное поведение

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> [c++]Странное поведение
Имя
Сообщение << Старые топики   Новые топики >>
[c++]Странное поведение - 2011-05-16 14:57:31.990000   
KwanzaBot

Сообщений: 129
Оценки: 0
Присоединился: 2011-04-18 19:45:33.773333
Как я понимаю, то тут какая-то проблема с стеком, хотя может это я нуб.
Есть код:
std::string&amp; func() { WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &amp;wsaData); sockaddr_in _sockaddr; _sockaddr.sin_family = AF_INET; _sockaddr.sin_port = htons(80); _sockaddr.sin_addr.s_addr = inet_addr("10.0.0.7"); SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); connect(sock, (sockaddr *)&amp;_sockaddr, sizeof(_sockaddr)); std::string buf = "Тут http-запрос. С ним все ок)"; char to[1024]; char from[1024]; strcat(to, buf.c_str()); send(sock, to, sizeof(to), 0); recv(sock, from, sizeof(from), 0); rtrn += from; std::string x = "=)"; return x; } Функция возвращает, как видно, x. Делаю что-то типа:
std::cout &lt;&lt; func(); Но место смайлика появляется в консоли html-код, то есть rtvn,  и сразу программа завершается с ошибкой. Как так?
Post #: 1
RE: [c++]Странное поведение - 2011-05-16 16:44:26.060000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
1) Нельзя возвращать ссылки на локальные нестатические переменные.
2) Зачем тут strcat?
Post #: 2
RE: [c++]Странное поведение - 2011-05-16 18:34:09.743333   
KwanzaBot

Сообщений: 129
Оценки: 0
Присоединился: 2011-04-18 19:45:33.773333
2) Зачем тут strcat? По другому не получалось) Было типа нельзя преобразовать char* в const char*, или что-то подобное. Точно не помню.
Post #: 3
RE: [c++]Странное поведение - 2011-05-16 18:48:45.980000   
slipslop

Сообщений: 115
Оценки: 0
Присоединился: 2010-12-27 20:21:35.253333
quote:

ORIGINAL: _SaZ_

1) Нельзя возвращать ссылки на локальные нестатические переменные.

Немножко поясню, а то прозвучало как "нельзя переходить дорогу на красный!", надеюсь _SaZ_ меня простит :)
Когда вызывается функция, все локальные переменные создаются в стековом фрейме. При выходе из функции (при возврате в вызывающую функцию) этот стековый фрейм вместе со всеми локальными переменными становится невалидным. Т.е., в твоём случае происходит следующее:

1) вызывается функция func(), для неё создаётся фрейм, в этом фрейме локальная переменная x;
2) func() заканчивает свою работу, стек раскручивается назад на один фрейм, данные всё ещё существуют, но ссылки на них уже считаются нелегальными, потому что:
3) вызывается std::cout(), для него также создаётся фрейм, частично или полностью перекрывающий место, где раньше был стековый фрейм функуции func(). Поскольку x находился на этой области, его значение затирается другими данными;
4) функция std::cout() пытается прочитать значение x, но оно уже затёрто, поэтому на печать выводится случайная последовательность символов.
Post #: 4
RE: [c++]Странное поведение - 2011-05-17 02:25:18.556666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Начни с чтения документации. У std::sting есть такой волшебный метод, как c_str(). А если уж хочется всё делать через (_!_) - то юзай strcpy, поскольку strcat тут некорректно отрпботает (у тебя массив непроинициализированный)
Post #: 5
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> [c++]Странное поведение







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.