#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct NBIG{
int number;
struct NBIG *nseg;
struct NBIG *nant;
}Nbig;
int main(int argc,char *argv[])
{
char *namefile,ch;
Nbig *new_node=NULL,*resmulti=NULL,*ofsum=NULL;
Nbig *list=NULL;
int cont,x,y;
FILE *arq;
if (argc>3) {
for(cont=3; cont < argc; cont++){
namefile =strcat(argv[cont], ".txt");
printf("%s", namefile);
arq = fopen(namefile, "r");
if(arq == NULL)
printf("Fail\n");
else{
fseek(arq, -1, SEEK_END);
long position = ftell(arq);
while(position >= 0){
fseek(arq, position, SEEK_SET);
fread(&ch, sizeof(char), 1, arq);
if (ch == ' ') {
ofsum=soma(ofsum, list);
list = delete_list(list);
new_node = delete_list(new_node);
position = position-1;
}
else{
new_node =makenode();
new_node->number= atoi(&ch);
list =insertfirst(list, new_node);
position--;
show(list);
printf("\n");
}
}
show(ofsum);
printf("\n");
fclose(arq);
}
}
}
else{
...
}
return 0;
}
在文件中:
(数字之间用1个空格隔开)
例:
123 123
我尝试执行该程序并返回:
1个
21
321
agrv(28381,0x7fff8f271380)malloc:*对象错误
0x7f814bc026c0:未分配正在释放的指针*设置a
malloc_error_break中的断点进行调试
我该如何解决这个问题?
我在执行中介绍3个参数
Nbig *makenode(){
Nbig *R = (Nbig*)malloc(sizeof(Nbig));
R->number=0;
R->nant=NULL;
R->nseg=NULL;
return(R);
}
Nbig *delete_list(Nbig *L) {
if(L==NULL){
return L;
}
Nbig *next;
while (L) {
next = L->nseg;
free(L);
L = next;
}
return NULL;
}
Nbig *insertfirst(Nbig *A,Nbig *nv){
if(A==NULL){
nv->nseg=NULL;
nv->nant=NULL;
return nv;
}
nv->nseg=A;
A->nant=nv;
return nv;
}
功能辅助
最佳答案
您释放列表的循环是错误的。您要释放当前元素L
,然后在下一次迭代中使用L->nseg
。释放指针后延迟指针是未定义的行为。
在释放当前元素之前,需要保存nseg
指针。
它应该是:
Nbig *apaga(Nbig *L) {
Nbig *next;
while (L) {
next = L->nseg;
free(L);
L = next;
}
return NULL;
}