使用cURL进行分段错误

时间:2011-05-01 02:01:16

标签: c curl segmentation-fault libcurl

我正在尝试使用带有以下代码的cURL库从我的服务器下载测试文件:

#define CURL_STATICLIB

#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include <string.h>

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    size_t written;

    written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void)
{
    CURL *curl;
    FILE *fp;
    CURLcode res;

    char *url = "http://pixhost.tk/test.txt";
    char outfilename[FILENAME_MAX] = "/Users/Nathan/Desktop";
    curl = curl_easy_init();

    if (curl)
    {
        fp = fopen(outfilename, "wb");

        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

        res = curl_easy_perform(curl);

        curl_easy_cleanup(curl);
        fclose(fp);
    }

    return 0;
}

并按照以下方式编译:

$ gcc main.c -lcurl -o curltest

但是当我执行它时,我收到了分段错误错误。我该怎么做才能纠正这个问题?

2 个答案:

答案 0 :(得分:3)

我不熟悉cURL,但有两件事可能会对你有帮助,所以如果我说废话,请原谅我:

  1. char *url = "http://pixhost.tk/test.txt";是一个只读字符串,因此将其更改为const char *url = "http://pixhost.tk/test.txt";这可能会在编译期间显示您的问题。
  2. 你没有检查fopen的结果,也许它失败了,这解释了段错误,而且我似乎很可能因为你试图打开“/ Users / Nathan / Desktop”这应该是目录AFAIK。

答案 1 :(得分:0)

自从我使用curl已经有一段时间了,我不确定这会导致段错误,我认为你应该这样调用fwrite:

fwrite(ptr, 1, nmemb * size, stream);

因为fwrite返回写入的元素数,而{{1>}不是(我不认为)保证是一个。而且由于你正在返回fwrite返回的内容,我相信你返回的字节数比你实际编写的少,因为函数应该返回它写的字节数。

相关问题