Двойное освобождение или повреждение (! Prev) Прервано (ядро сброшено) Ошибка на языке C - PullRequest
0 голосов
/ 07 февраля 2019
int get_rates(Date start_at, Date end_at,unsigned n_currencies, char *currencies[], Rate *result){
    char link[1024];
    char * simbolos=envirgular(currencies,n_currencies);
    char * linkp=link;
    snprintf(link, sizeof(link),  "https://api.exchangeratesapi.io/history?start_at=%d-%d-%d&end_at=%d-%d-%d&symbols=%s"
    ,start_at.year,start_at.month,start_at.day,end_at.year,end_at.month,end_at.day,simbolos);
    start_at.day++;
    size_t datasize;
    char *a=http_get_data(linkp,&datasize);
    int numerodedias=getnumberofdays(a);
    result=realloc(result,numerodedias*sizeof(Rate));
    Date datas[numerodedias];
    char * info=strstr(a,"rates");
    char * data=malloc(10*sizeof(char));
    char * year=malloc(4*sizeof(char));
    char * day_month=malloc(2*sizeof(char));
    char * value=malloc(6*sizeof(char));
    for(int j=0;j<numerodedias;j++){
        result[j].values=calloc(n_currencies,sizeof(char*));
        result[j].names=calloc(n_currencies,sizeof(char*));
        info=strstr(info,"-");
        info=info-4;
        strncpy(data,info,10);
        strncpy(year,data,4);
        datas[j].year=atoi(year);
        data=data+5;
        strncpy(day_month,data,2);
        datas[j].month=atoi(day_month);
        data=data+3;
        strncpy(day_month,data,2);
        datas[j].day=atoi(day_month);
        for(int i=0;i<n_currencies;i++){
            info=strstr(info,currencies[i]);
            info=info+5;
            strncpy(value,info,6);
            result[j].values[i]=value;
            result[j].names[i]=currencies[i];





    }
    for(int i=0;i<2;i++){
    printf("\nValor%s\nMoeda%s\n",result[j].names[i],result[j].values[i]);}
    result[j].data.day=datas[j].day;
    result[j].data.month=datas[j].month;
    result[j].data.year=datas[j].year;
    //printf("\nDia:%d-%d-%d   %s=%s    %s=%s\n",result[j].data.day,result[j].data.month,result[j].data.year,result[j].names[0],result[j].values[0],result[j].names[1],result[j].values[1]);
        }

    return 0;
}

typedef struct Data{
    int year;
    int month;
    int day;

}Date;


typedef struct SingleRate{
    Date  data;
    char **names;
    char **values;
}Rate;

Привет, сообщество переполнения стека, я изучаю язык C в своем классе, и меня попросили создать небольшой проект, который ищет на веб-сайте с помощью libcurl некоторую информацию об определенных валютах и ​​значениях в определенный день.Я дошел до того, что могу продолжить из-за этой ошибки, я искал в Интернете ответы на ту же ошибку, но, похоже, я не нашел, где это было. Был бы рад, если бы кто-то мог объяснить мне, что я делаю неправильноБлагодаря.

1 Ответ

0 голосов
/ 07 февраля 2019

Предупреждение:

char * year=malloc(4*sizeof(char));
...
strncpy(year,data,4);
datas[j].year=atoi(year);

год не имеет места для завершающего нулевого символа и в этом случае отсутствует, atoi имеет неопределенное поведение

То же самое для day_month

char * day_month=malloc(2*sizeof(char));
...
strncpy(day_month,data,2);
datas[j].month=atoi(day_month);

Другая вероятная проблема, когда:

        result[j].values[i]=value;

вы всегда копируете один и тот же char * в цикле, если считаете,у вас будут разные значения, это неверно.Существует риск, что у него нет завершающего нулевого символа, так как он устанавливается через strncpy Возможно, вы освободите его позже (char * value=malloc(6*sizeof(char));).Таким образом, вы, вероятно, должны strdup это, но предупреждение с отсутствующим нулевым символом

...