2015-06-15 3 views
0

У меня есть простой код:переменной 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, он отлично работает.

+1

Вы код неполон ('request',' ar', 'деклараций MAXLEN'), но вы, вероятно, есть переполнение буфера в объекте стеки. – ouah

+5

Не используйте символы с ведущим подчеркиванием, за которым следует буква с буквой, которые зарезервированы во всех областях. [См. Здесь для получения дополнительной информации.] (Http://stackoverflow.com/a/228797/440558) –

+4

Кроме того, у вас, вероятно, есть неопределенное поведение в вашем коде. Данные, возвращаемые ['c_str'] (http://en.cppreference.com/w/cpp/string/basic_string/c_str), являются * только для чтения *, попытка записи в этот массив приводит к неопределенному поведению. Кроме того, если длина строки меньше, чем 'MAXLEN', вы даже можете писать за пределами, еще раз приводя к UB. –

ответ

0

Вы переходящая в request функции SDLNet_TCP_Recv и говорить, что функция, которая request указывает на буфер размером MAXLEN. Поскольку request происходит от отбрасывания константы из буфера пустого std::string, это явно неправильно.

Вы хотите вектор

std::vector<unsigned char> request; 
request.resize(MAXLEN); 

... 

nrcv = SDLNet_TCP_Recv(sock , request.data() , request.size()) ; 
+0

Спасибо за хорошие комментарии , – Slava