realloc (): недопустимый следующий размер

У меня проблема с функцией realloc. Я использую только C (так что нет вектора) с LibCurl. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю следующую ошибку (realloc (): недопустимый следующий размер) на 12-й итерации функции write_data (функция, которую я передаю Curl в качестве обратного вызова, вызывается каждый раз, когда libcurl имеет некоторые данные для передачи назад (данные передаются кусками)).

Трассировка:

-Removed-

Источник:

#include  #include  #include  #include  char * Data; //stores the data size_t RunningSize; int write_data( char *ptr, size_t size, size_t nmemb, void *stream ) { size_t ThisSize = (size * nmemb); //Stores the size of the data to be stored size_t DataLen = strlen( Data ); //length of the data so far RunningSize = (RunningSize + ThisSize ); //update running size (used as new size) Data = realloc( Data, RunningSize ); //get new mem location (on the 12th iteration, this fails) strcat( Data, ptr); //add data in ptr to Data return ThisSize; //the function must return the size of the data it received so cURL knows things went ok. } int main( ) { CURL *curl; CURLcode res; const char * UserAgent = ""; Data = malloc(1); //so realloc will work RunningSize += 1; curl = curl_easy_init(); if(curl) { curl_easy_setopt( curl, CURLOPT_NOBODY, 0 ); curl_easy_setopt( curl, CURLOPT_URL, "http://www.google.co.uk/" ); curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt( curl, CURLOPT_USERAGENT, UserAgent ); curl_easy_setopt( curl, CURLOPT_HEADER, 1 ); //preform request. res = curl_easy_perform(curl); //output the data (debugging purposes) puts( Data ); //cleanup curl_easy_cleanup(curl); free(Data); } return 0; } 

Заранее спасибо,

Данные, переданные в write_data() , не обязательно nul-terminated; поэтому он сообщает вам количество байтов.

Это означает, что вы не можете использовать strcat() . Использование этого метода завершает работу с концом массива и искажает структуры данных, используемые malloc / realloc , поэтому ошибка.

write_data() следует использовать memcpy() , например:

 int write_data( char *ptr, size_t size, size_t nmemb, void *stream ) { size_t ThisSize = (size * nmemb); //Stores the size of the data to be stored size_t DataLen = RunningSize; //length of the data so far RunningSize = (RunningSize + ThisSize ); //update running size (used as new size) Data = realloc( Data, RunningSize ); //get new mem location (on the 12th iteration, this fails) memcpy((char *)Data + DataLen, ptr, ThisSize); //add data in ptr to Data return ThisSize; //the function must return the size of the data it received so cURL knows things went ok. } 

Вам также нужно будет инициализировать RunningSize до 0, а не 1. Вы можете инициализировать Data до NULL – разрешить NULL для realloc() , и он ведет себя так же, как malloc() ).