[c++]Странное поведение
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
[c++]Странное поведение - 2011-05-16 14:57:31.990000
|
|
|
KwanzaBot
Сообщений: 129
Оценки: 0
Присоединился: 2011-04-18 19:45:33.773333
|
Как я понимаю, то тут какая-то проблема с стеком, хотя может это я нуб. Есть код:
std::string& func()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &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 *)&_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 << func();
Но место смайлика появляется в консоли html-код, то есть rtvn, и сразу программа завершается с ошибкой. Как так?
|
|
|
RE: [c++]Странное поведение - 2011-05-16 16:44:26.060000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
1) Нельзя возвращать ссылки на локальные нестатические переменные. 2) Зачем тут strcat?
|
|
|
RE: [c++]Странное поведение - 2011-05-16 18:34:09.743333
|
|
|
KwanzaBot
Сообщений: 129
Оценки: 0
Присоединился: 2011-04-18 19:45:33.773333
|
2) Зачем тут strcat? По другому не получалось) Было типа нельзя преобразовать char* в const char*, или что-то подобное. Точно не помню.
|
|
|
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, но оно уже затёрто, поэтому на печать выводится случайная последовательность символов.
|
|
|
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 тут некорректно отрпботает (у тебя массив непроинициализированный)
|
|
|
|
|