2014-09-27 3 views
0

Что я пытаюсь использовать libcurl, это отправить запрос GET на сервер и сохранить ответ. Он отлично работает, когда я не использую CURLOPT_WRITEFUNCTION и CURLOPT_WRITEFDATA, ответ идет на стандартный поток, и программа закрывается после нажатия кнопки.Appcrash with cURL

Когда я добавляю свою собственную функцию и переменную, чтобы сохранить ответ, однако, в конце ответа есть и дополнительный символ мусора, и программа вылетает после нажатия кнопки.

#include <iostream> 
#include <tchar.h> 
#include <stdio.h> 
#include <conio.h> 

#include "curl/curl.h" 
#include "curl/easy.h" 

#define FAIL 0 
#define PASS 1 

size_t curlWrite(void*, size_t, size_t, void*); 

CURL  *curl; 
const char *baseURL = "XXXX"; 
const char *authHeader = "Authorization: Token token=YYYY"; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    bool cURLStatus = PASS; 
    CURLcode res; 

    struct curl_slist *headers = NULL; 
    headers = curl_slist_append(headers, authHeader); 
    char *response; 

    curl = curl_easy_init(); 
    if(curl) 
    { 
     curl_easy_setopt(curl, CURLOPT_URL, baseURL); 
     curl_easy_setopt(curl, CURLOPT_HTTPGET, 1); 
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWrite); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, response); 
     res = curl_easy_perform(curl); 
     if(CURLE_OK != res) cURLStatus = FAIL; 
    } 
    else cURLStatus = FAIL; 

    if(cURLStatus) printf("Response: %s", response); 
    else   printf("Error: %s", curl_easy_strerror(res)); 

    curl_easy_cleanup(curl); 

    _getch(); 

    return 0; 
} 

static size_t curlWrite(void *src, size_t size, size_t nmemb, void *dst) 
{ 
    printf("Source: %s", src); 
    memcpy(dst, src, size * nmemb); 
    return size * nmemb; 
} 

Это ответ я получаю, за которым следует APPCRASH, используя код выше:

Источник: { "current_bac": 0, "time_until_sober": 0}

Ответ: { "current_bac": 0, "time_until_sober": 0} Р

Если IC omment следующие строки (и Printf):

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWrite); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, response); 

Я получаю это:

{ "current_bac": 0, "time_until_sober": 0}

Что я делать не так?

ответ

0

Человек, глядя на подобные проблемы вокруг, я был уверен, что мне пришлось скомпилировать libcurl.

На самом деле, решение заключается в использовании:

char *response = (char *)malloc(sizeof(*response) * 100); 

Вместо того, чтобы:

char *response;