realloc():下一个大小无效
我在使用 realloc 函数时遇到问题。我只使用 C(所以没有向量)和 LibCurl。我遇到的问题是,在 write_data 函数的第 12 次迭代中出现以下错误 (realloc(): invalid next size)(我作为回调传递给 Curl 的函数,每次 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;
}
提前致谢,
I'm having a problem with the realloc function. I'm using C only (so no vector) with LibCurl. The problem I'm having is that I'm getting the following error (realloc(): invalid next size) on the 12th iteration of the write_data function (the function I pass to Curl as a callback, it is called each time libcurl has some data to pass back (data is passed in chunks) ).
Trace:
-Removed-
Source:
#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;
}
Thanks in advance,
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
传递给
write_data()
的数据不一定以 null 结尾;这就是为什么它告诉您字节数。这意味着您无法使用
strcat()
。使用它会超出数组的末尾并破坏malloc
/realloc
使用的数据结构,因此会出现错误。您的
write_data()
应该使用memcpy()
代替,如下所示:您还需要将
RunningSize
初始化为 0,而不是 1。您可以将Data
初始化为NULL
- 允许将NULL
传递给realloc()
(并使其行为类似于>malloc()
)。The data passed in to
write_data()
isn't necessarily nul-terminated; that's why it tells you the number of bytes.This means you can't use
strcat()
. Using it is running off the end of the array and corrupting the data structures used bymalloc
/realloc
, hence the error.Your
write_data()
should usememcpy()
instead, like so:You will also need to initialise
RunningSize
to 0, not 1. You can initialiseData
toNULL
- passingNULL
torealloc()
is allowed (and makes it behave just likemalloc()
).