|
|
|
| Здравствуйте!
Дело вот в чем. Создаю в main() указатель типа char* чтобы в дальнейшем записать в него строку.
Только вот не понимаю какое значение этому указателю нужно присвоить чтобы в дальнейшем можно было выделить для него память.
Если оставить его пустым, то realloc завершается ошибкой, если же присвоить ему NULL получаю ошибку сегментирования.
Если обьявить его как char* document = malloc (0); то все отрабатывает так как и нужно, но что-то мне кажется это не совсем верно.
А может я вообще изначально начал неправильно делать?)
Подскажите пожалуйста решение. За много часов гугления я так и не понял свой ошибки.
Кмпилятор gcc (Gentoo 4.8.1-r1 p1.2, pie-0.5.7) 4.8.1, glibc-2.17
Вот собственно проблема в char *document
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
void get_document (const char *url, char **buffer);
size_t curl_write (char *content, size_t size, size_t nmemb, char **buffer);
int main (int argc, char **argv) {
int count;
for (count = 1; count < argc; count++) {
char *document = NULL;
//printf ("Ptr = %p\n", document);
get_document (*(argv + count), &document);
printf ("%s\n", document);
free (document);
}
return 0;
}
size_t curl_write (char *content, size_t size, size_t nmemb, char **buffer) {
//printf ("Ptr = %p\n", *buffer);
size_t real_size = size * nmemb;
size_t current_size = strlen (*buffer) * sizeof (char);
if (!(*buffer = (char*) realloc (*buffer, current_size + real_size + 1))) {
fprintf (stderr, "Ошибка выделения памяти! %s\n", __FUNCTION__);
exit (1);
}
memcpy (*buffer + current_size, content, real_size);
*(buffer + current_size + real_size) = '\0';
return real_size;
}
void get_document (const char *url, char **buffer) {
CURL *curl_resource;
CURLcode curl_result;
//printf ("Ptr = %p\n", *buffer);
if (!(curl_resource = curl_easy_init ())) {
fprintf (stderr, "Произошла ошибка во время инициализации CURL!\n");
exit (1);
}
curl_easy_setopt (curl_resource, CURLOPT_URL, url);
curl_easy_setopt (curl_resource, CURLOPT_WRITEDATA, buffer);
curl_easy_setopt (curl_resource, CURLOPT_WRITEFUNCTION, curl_write);
if ((curl_result = curl_easy_perform (curl_resource)) != CURLE_OK) {
fprintf (stderr, "Произошла ошибка во время выполнения CURL: %s!\n", curl_easy_strerror (curl_result));
}
curl_easy_cleanup (curl_resource);
}
|
| |
|
|
|
|
|
|
|
для: MHz
(28.10.2013 в 22:57)
| | Разобрался. Оказывается проблема была в использовании функции strlen() которая не проверяет значение на NULL )) | |
|
|
|