2010-03-09 4 views
0

Это часть моего кода, который читает ответ http. Предполагается увеличить размер буфера, если он закончится. Но я продолжаю получать нарушения доступа. Это происходит при копировании данных в новый буфер: memcpy (tmp_alloc, rec, ResponseLength); Любая помощь/предложения приветствуются.C malloc увеличить размер буфера

#define SERVER_CHUNK 1024 

char *rec = new char[10000]; 
char in_buff[SERVER_CHUNK]; 
int in_sz, 
    ResponseLength = 0, 
    rec_len = 10000; 

in_sz = recv(ss,in_buff,SERVER_CHUNK,0);//get the response 

while(in_sz > 0) 
{   

    memcpy(rec + ResponseLength,in_buff,in_sz); 
    ResponseLength += in_sz; 

    if((ResponseLength + SERVER_CHUNK) > rec_len) 
    { 
     char *tmp_alloc = (char*) malloc (ResponseLength + SERVER_CHUNK); 
     if(!tmp_alloc) 
     { 
      printf("failed to alocate memory!\n"); 
      break; 
     } 
     memcpy(tmp_alloc, rec, ResponseLength); 
     free(rec); 
     rec = tmp_alloc; 
     rec_len = ResponseLength + SERVER_CHUNK; 
    } 

    in_sz = recv(ss,in_buff,SERVER_CHUNK,0);  
} 
+6

Возможно, вы захотите взглянуть на 'realloc' (http://www.opengroup.org/onlinepubs/007908775/xsh/realloc.html). –

+1

Или, поскольку код использует 'new', вы можете посмотреть' std :: vector'. –

+0

Предполагается, что это C или C++? –

ответ

4

Возможно, вы развращаете кучу, смешивая новый [] со свободным(), который не поддерживается.

Изменение:

char *rec = new char[10000]; 

To:

char *rec = (char*) malloc(10000); 

и посмотреть, если это делает никакой разницы.

+1

Действительно. Также не существует 'new char [10000]' valid C, и на этот вопрос нет тега C++. –

+0

#define new NULL; // – tur1ng

+1

@ tur1ng: не работает. –

0

не было бы лучше, чтобы эти данные были списком буферов? Таким образом, вам не нужно перераспределять/копировать все данные каждый раз, когда вы превышаете свой буфер. вам нужно будет поддерживать только один/двойной список ссылок

Смежные вопросы