C中记忆管理的问题

时间:2017-10-19 18:58:49

标签: c memory stack heap free

我有以下C函数,这导致我内存很多问题,如果我不释放内存它工作正常但是当我调用另一个函数我得到一个malloc内存损坏错误,但我释放它我得到免费无效指针。最后,当我为fecha和fechaVariable定义新指针时,由于strtok工作很奇怪,我得到了corrupted_size vd prev_size错误。有人能帮我吗。这是我的代码:

void mensual_precipitacion(struct fila *arregloArchivo, char *precipitacion, int estacion){
    float acumulado = 0.00;
    char *fecha;
    char *fechaVariable;

    int i;
    int boolIncorrecto = 1;
    char *mes;
    char *anio;
    char *lluvia;   
    int boolfecha = 1;

    fecha = malloc(1000*sizeof(char));
    fechaVariable = malloc(1000*sizeof(char));
    lluvia = malloc(1000*sizeof(char));



    for(i=0;i<cantDatos;i++){

        if(arregloArchivo[i].numero != estacion){
            continue;
        }
        boolIncorrecto =0; 
        if(boolfecha){
            strcpy(fecha,arregloArchivo[i].fecha);  
            boolfecha = 0;

            fecha = strtok(fecha,"/");

            mes = strtok(NULL,"/");
            anio = strtok(NULL," ");
        }

        strcpy(fechaVariable,arregloArchivo[i].fecha);

        fechaVariable = strtok(fechaVariable,"/");

        fechaVariable = strtok(NULL, "/");

        if(strcmp(mes,fechaVariable) == 0){
            acumulado += arregloArchivo[i].precipitacion;

        }else{

            sprintf(lluvia,"%s/%s:%f[mm]\n",mes,anio,acumulado);
            strcat(precipitacion,lluvia);
            acumulado = 0.00;
            boolfecha = 1;
            memset(lluvia,'\0',sizeof(lluvia));
        }

    }
    if(boolIncorrecto){
        strcpy(lluvia,"Nro de estacion inexistente");
    }else{
        sprintf(lluvia,"%s/%s:%f[mm]\n",mes,anio,acumulado);
    }
    //
        //printf("%s\n",lluvia );
    strcat(precipitacion,lluvia);

    free(fecha);
    free(fechaVariable);    
    free(lluvia);
}

1 个答案:

答案 0 :(得分:1)

如果从free(ptr)ptr返回malloc()的值,则只能致电realloc()。您的代码稍后会:

fecha = strtok(fecha, "/");

所以当你到达函数的末尾时,fecha不再包含你最初包含的指针:

fecha = malloc(1000 * sizeof(char));

您应该在循环中使用其他变量,这样就不会丢失原来的fecha指针。

您遇到同样的问题:

fechaVariable = strtok(fechaVariable,"/");

所以也可以在这里使用不同的变量。

实际上,没有充分理由对这些变量使用动态分配。只需声明:

char fecha[1000], fechaVariable[1000], lluvia[1000];

然后使用strtok的不同变量,因为您无法分配数组变量。

char *fecha_slash = strtok(fecha, "/");
char *fechaVariable_slash = strtok(fechaVariable, "/");