我想写一个检索网页的函数

I want to write a function that retrieves a webpage

我正在尝试编写一个 returns 指定 URL 的 html 代码的函数 到目前为止,这是我的代码:

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;
}

将相同的代码嵌入到 main 函数的主体中时工作正常。

您从不初始化 buffer,您应该将 buffer.buffer 设置为 NULL 以便 realloc() 像您期望的那样工作,并且 buffer.size 必须是初始化为或您的程序将调用未定义的行为。

您应该在 getHtml()

中执行此操作
buffer.buffer = NULL;
buffer.size = 0;

curl_easy_perform().

之前

此外,要以安全的方式使用 realloc(),请执行此操作

void *aux;
aux = realloc(mem->buffer, mem->size + realsize + 1);
if (aux == NULL)
    return 0; // Maybe `free(mem->buffer); mem->buffer = NULL; mem->size = 0;'
mem->buffer = aux;
// Continue, memcpy() and update mem->size

如果仅打印出第一个字符串 success,则可能是第一次调用 curl 函数时出现问题。

您应该做的第一步是检查 curl 函数的每个 return 值:

CURLcode ok = curl_easy_setopt(myHandle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
if( ok != CURLE_OK )
{
    printf( "Error here %d\n" , __LINE__ );
}

第一次调用 curl 函数失败的真正原因是 CURL *myHandle 没有初始化:

所以初始化它:

CURL *myHandle= curl_easy_init();
if(!myHandle) { /*handle error ...*/ }

完成后将其删除:

curl_easy_cleanup(myHandle);

已经指出的另一个问题是 struct BufferStruct buffer 未初始化,因此当使用未初始化的指针调用时,WriteMemoryCallback 中的 realloc 失败。