realloc():下一个大小无效
我遇到了realloc函数的问题。 我只使用C(所以没有矢量)和LibCurl。 我遇到的问题是我在write_data函数的第12次迭代中得到以下错误(realloc():无效的下一个大小)(我将函数传递给Curl作为回调,每次libcurl都调用它时一些要传回的数据(数据以块的forms传递))。
跟踪:
-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()
的数据不一定是以空值终止的; 这就是它告诉你字节数的原因。
这意味着你不能使用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()
类似)。