【问题标题】:Double free or corruption (!prev) Aborted (core dumped) Error in C language双重释放或损坏 (!prev) 中止 (核心转储) C 语言中的错误
【发布时间】:2019-02-07 17:06:36
【问题描述】:
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;

你好 Stack Overflow 社区,我正在课堂上学习 C 语言,我被要求制作这个小项目,该项目使用 libcurl 在网站中搜索有关特定日期的某些货币和价值的信息。 由于这个错误,我已经到了可以继续的地步,我一直在互联网上搜索相同错误的答案,但我似乎没有找到它在哪里 如果有人能向我解释我做错了什么会很高兴 谢谢。

【问题讨论】:

  • 我也可以通过一些 printf 看到问题似乎出在值数组上
  • 请在其中创建一个minimal reproducible example
  • 我没有看到对freerealloc 的任何呼叫。或者任何直接的缓冲区溢出(但是用那堵代码很难看到)。请尝试创建Minimal, Complete, and Verifiable Example 向我们展示。
  • 好的,我会努力的,谢谢:)
  • 另外,请learn how to debug your programs。使用更简单的代码会更简单。尝试缩减并尽可能多地删除。测试一下。然后添加一段small代码,测试一下。添加另一段 small 代码。测试一下。等等。这将有助于发现问题并进行大量调试。

标签: c compiler-errors segmentation-fault corruption double-free


【解决方案1】:

警告:

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

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 它但警告缺少空字符

【讨论】:

  • 这真的取决于data 中字符串的长度。如果只有三个相应的一个字符,那没关系。但情况可能并非如此。
  • @Someprogrammerdude 是的,这里的情况并非如此,今年 4 个字符,从 10 日开始,每天有 2 个字符的风险
  • @bruno 在该行 result[j].values[i]=value;你提到我确实想要不同的值,我能做些什么来纠正这个问题??
  • @JoaoBarata 正如我所说你需要 strdup,但再次警告可能缺少空字符
  • @bruno 是的,效果很好,谢谢 ^^ 现在我需要找到双重免费或损坏和核心转储
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多