Я пытаюсь написать функцию, которая возвращает HTML-код указанного URL вот мой код до сих пор:Я хочу, чтобы написать функцию, которая получает веб-страницу
char * getHtml()
{
struct BufferStruct buffer;
CURLcode result;
CURL *myHandle;
printf("success\n");
// Passing the function pointer to LC
curl_easy_setopt(myHandle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
printf("success\n");
// Passing our BufferStruct to LC
curl_easy_setopt(myHandle, CURLOPT_WRITEDATA, (void *)&buffer);
curl_easy_setopt(myHandle, CURLOPT_URL, "http://www.example.com");
result = curl_easy_perform(myHandle);
curl_easy_cleanup(myHandle);
return buffer.buffer;
}
только первая строка успеха напечатал: успех
./compile: line 3: 27548 Segmentation fault ./a.out
вот мой writememorycallback:
static size_t WriteMemoryCallback (void *ptr, size_t size, size_t nmemb, void *data)
{
size_t realsize = size * nmemb;
struct BufferStruct *mem = (struct BufferStruct *) data;
mem->buffer = realloc(mem->buffer, mem->size + realsize + 1);
if (mem->buffer == NULL)
return 0;
if (mem->buffer)
{
memcpy(&(mem->buffer[ mem->size ]), ptr, realsize);
mem->size += realsize;
mem->buffer[ mem->size ] = 0;
}
return realsize;
}
тот же код, когда он встроен в тело основной функции, работает просто отлично.
Пожалуйста, открепите код, я просто сделал это для другого сообщения. Например, установите 'astyle' и просто' astyle -A1 mysourcefile.c'. И здесь 'struct BufferStruct * mem = (struct BufferStruct *) data;' it может быть 'struct BufferStruct * mem = data;'! Кроме того, 'mem-> buffer = realloc (mem-> buffer, mem-> size + realsize + 1);' what if 'mem-> buffer' является' NULL' после 'realloc()'? Ваша программа будет утечка памяти! –
Вы уверены, что передать неинициализированный указатель на 'curl_easy_setopt' - хорошая идея? Я уверен, что вы вызываете неопределенное поведение. – szczurcio
@szczurcio Нет проблем, но он должен быть инициализирован до 'curl_easy_perform()'. –