Realloc (): неверный следующий размер [дубликат
Вопрос
Этот вопрос уже имеет ответ здесь:
У меня проблема с функцией Realloc. Я использую C только C (так не вектор) с libcurl. Проблема у меня есть то, что я получаю следующую ошибку (Realloc (): неверный следующий размер) на 12 итерации функции write_data (функция, которую я передаю для завивки как обратный вызов, она называется каждый раз, когда есть libcurl Некоторые данные для возврата (данные передаются в куски)).
След:
-Удаленный-
Источник:
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <string.h>
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()
не обязательно заканчивается; Вот почему это говорит вам количество байтов.
Это означает, что вы не можете использовать 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()
).