У меня есть простой код:переменной uint32_t странно меняются
#define NUM_UA_SOCK 100
typedef struct _UA_REQUEST
{
string full_url;
uint32_t url_adler32 ;
TCPsocket sock_ua ;
uint32_t status_flag ; // ref Enum STATUS
} UA_REQUEST ;
UA_REQUEST GLB_ARRAY__UA_REQ[ NUM_UA_SOCK ] ;
void handle_ua_sock_ready(uint32_t ii)
{
string _req_mstr;
byte*request = (byte*) _req_mstr.c_str() ;
byte*pcrlf = NULL ;
UA_REQUEST*ar = GLB_ARRAY__UA_REQ ;
// Get request from UA
int32_t nrcv ;
printf("index = %lu\n", ii);
TCPsocket sock = ar[ii].sock_ua;
nrcv = SDLNet_TCP_Recv(sock , request , MAXLEN) ;
printf("After index = %lu\n", ii);
}
Вторые переменные в начале handle_ua_sock_ready() FUNC имеет значение 0. После вызова nrcv = SDLNet_TCP_Recv (носок, запрос, MAXLEN); line это означает, что у него есть что-то очень большое значение, например 1852397344. Это однопоточное приложение. Я использую VS 2010, SDL, SDL_net-библиотеки. PS: Когда я скомпилировал его под Linux, он отлично работает.
Вы код неполон ('request',' ar', 'деклараций MAXLEN'), но вы, вероятно, есть переполнение буфера в объекте стеки. – ouah
Не используйте символы с ведущим подчеркиванием, за которым следует буква с буквой, которые зарезервированы во всех областях. [См. Здесь для получения дополнительной информации.] (Http://stackoverflow.com/a/228797/440558) –
Кроме того, у вас, вероятно, есть неопределенное поведение в вашем коде. Данные, возвращаемые ['c_str'] (http://en.cppreference.com/w/cpp/string/basic_string/c_str), являются * только для чтения *, попытка записи в этот массив приводит к неопределенному поведению. Кроме того, если длина строки меньше, чем 'MAXLEN', вы даже можете писать за пределами, еще раз приводя к UB. –