哈哈,问题已经解决,问题的原因是free的时候,temp指向的内存已经不是刚刚开始分配的那快内存了,所以会发生错误.可以在获取分配的内存时保存起示地址,最后释放之前在把地址赋给分配的变量,就可以了.最后,不要忘记消灭野指针...
一个类似的问题的解决的代码:
#include
#include
#include
void main(void)
{char **str;
int i,size=4;
str=(char**)malloc(sizeof(char**)*size);
memset(str,0,sizeof(char**)*size);
for(i=0;i=(char*)malloc(sizeof(char*)*size);
memset(str,0,sizeof(char*));
}
char*temp[4]={str[0],str[1],str[2],str[3]};
printf("init str address:\n\
str0:%x\n\
str1:%x\n\
str2:%x\n\
str3:%x\n", str[0],str[1],str[2],str[3]);
str[0]="kiki love juan!\n";
str[1]="what?\n";
str[2]="haha,really?\n";
str[3]="of course,i love her";
printf("after give the string:\n\
str0:%x\n\
str1:%x\n\
str2:%x\n\
str3:%x\n", str[0],str[1],str[2],str[3]);
for(i=0;i=temp;
printf("after modify the string:\n\
str0:%x\n\
str1:%x\n\
str2:%x\n\
str3:%x\n", str[0],str[1],str[2],str[3]);
free(str[0]);
free(str[1]);
free(str[2]);
free(str[3]);
}
完整的代码:
#include
#include
#include
#define SIZE 256
int ctoi(char c)
{int j=0;
j=c-48;
return j;
}
char itoc(int i)
{char c;
c=i+48;
return c;
}
void change(char*str,int l,int t)
{int i;
int j;
if(t==0)
{for(i=0;i==0)
str=48;
}
else
for(i=0;i=(char*)malloc(all);
memset(temp,0,al+bl);
middle=temp;//这里用middle数组来保存地址
printf("temp[%d] malloc ok!\n",i);
}
for(i=bl-1;i>=0;i--)
{
temp1=ctoi(b);
for(j=al-1;j>=0;j--)
{
temp2=ctoi(a[j]);
end1=temp1*temp2+k;
k=end1/10;
yu=end1%10;
c=itoc(yu);
temp[bl-1-i][all-al+j]=c;
if((j==0)&&(end1>=10))
{c=itoc(k);
temp[bl-1-i][all-al+j-1]=c;
}
}
k=0;
for(m=0;m,all,i);
for(i=0;i[j]);
printf("\n");
}
end2=0;
k=0;
for(j=all-1;j>=0;j--)
{for(i=0;i[j]);
end2+=k;
yu=end2%10;
k=end2/10;
result[j]=itoc(yu);
end2=0;
}
printf("--------------------------------------------------------------------------------\n");
for(i=0;i);
printf("\nok!");
free(result);
for(i=0;i=middle;//恢复分配的起示地址
free(temp);
temp=NULL;
middle=NULL;
}
free(temp);
result=NULL;
temp=NULL;
getchar();
} |