Форум: Форум C++Разное
Новые темы: 00
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Си. Нулевой указатель.
 
 автор: MHz   (28.10.2013 в 22:57)   письмо автору
 
 

Здравствуйте!

Дело вот в чем. Создаю в 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   (30.10.2013 в 22:23)   письмо автору
 
   для: MHz   (28.10.2013 в 22:57)
 

Разобрался. Оказывается проблема была в использовании функции strlen() которая не проверяет значение на NULL ))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования