Realloc (): неверный следующий размер [дубликат

StackOverflow https://stackoverflow.com/questions/2939091

  •  05-10-2019
  •  | 
  •  

Вопрос

У меня проблема с функцией Realloc. Я использую C только C (так не вектор) с libcurl. Проблема у меня есть то, что я получаю следующую ошибку (Realloc (): неверный следующий размер) на 12 итерации функции write_data (функция, которую я передаю для завивки как обратный вызов, она называется каждый раз, когда есть libcurl Некоторые данные для возврата (данные передаются в куски)).

След:

-Удаленный-

Источник:

#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <string.h>

char * Data; //stores the data
size_t  RunningSize;

int write_data( char *ptr, size_t size, size_t nmemb, void *stream )
{
    size_t ThisSize = (size * nmemb); //Stores the size of the data to be stored
    size_t DataLen = strlen( Data ); //length of the data so far

    RunningSize = (RunningSize + ThisSize ); //update running size (used as new size)

   Data = realloc( Data, RunningSize ); //get new mem location (on the 12th iteration, this fails)
   strcat( Data, ptr); //add data in ptr to Data

    return ThisSize; //the function must return the size of the data it received so cURL knows things went ok.
}

int main( )
{
  CURL *curl;
  CURLcode res;
  const char * UserAgent = "";

  Data = malloc(1); //so realloc will work
  RunningSize += 1;

  curl = curl_easy_init();
  if(curl)
  {
    curl_easy_setopt( curl, CURLOPT_NOBODY, 0 );
    curl_easy_setopt( curl, CURLOPT_URL, "http://www.google.co.uk/" );
    curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt( curl, CURLOPT_USERAGENT, UserAgent );
    curl_easy_setopt( curl, CURLOPT_HEADER, 1 );

    //preform request.
    res = curl_easy_perform(curl);

    //output the data (debugging purposes)
    puts( Data );

    //cleanup
    curl_easy_cleanup(curl);
    free(Data);
  }

  return 0;
}

Заранее спасибо,

Это было полезно?

Решение

Данные переданы в write_data() не обязательно заканчивается; Вот почему это говорит вам количество байтов.

Это означает, что вы не можете использовать strcat(). Отказ Использование его запускается с конца массива и повреждение структур данных, используемых malloc / realloc, Отсюда, отсюда ошибка.

Твой write_data() следует использовать memcpy() Вместо этого, как так:

int write_data( char *ptr, size_t size, size_t nmemb, void *stream )
{
    size_t ThisSize = (size * nmemb); //Stores the size of the data to be stored
    size_t DataLen = RunningSize; //length of the data so far

    RunningSize = (RunningSize + ThisSize ); //update running size (used as new size)

    Data = realloc( Data, RunningSize ); //get new mem location (on the 12th iteration, this fails)
    memcpy((char *)Data + DataLen, ptr, ThisSize); //add data in ptr to Data

    return ThisSize; //the function must return the size of the data it received so cURL knows things went ok.
}

Вам также нужно будет инициализировать RunningSize до 0, а не 1. Вы можете инициализировать Data к NULL - прохождение NULL к realloc() разрешено (и делает его вести себя так же, как malloc()).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top