我有以下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);
}
答案 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, "/");