2013-06-04 2 views
0

구조체의 배열에 할당 된 메모리를 해제하는 것과 관련된 초보자 질문이 있습니다.SIGTRAP을 일으키는 자유 함수

typedef struct { 
    char code[6]; 
    char name[31]; 
    char cname[31]; 
    int anno; 

} cliente; 

cliente *readcostumers(char*filename,int * dim) { 
    int i; 
    cliente *d; 
    cliente temp; 
    FILE*fp; 
    fp=fopen(filename,"r"); 
    *dim=0; 
    //count the number of lines 
    while(fscanf(fp,"%s %s %s %d", temp.code, temp.name, temp.cname,&(temp.anno))==4) 
     (*dim)++; 
    rewind(fp); 
    //allocate "dim" struct 
    int ss = sizeof(cliente); 
    d = (cliente*)malloc(ss * (*dim)); 
    cliente *currCli = d; 
    //assign lines to struct 
    for(i=0; i<*dim; i++) { 
     fscanf(fp,"%s %s %s %d",currCli->code, currCli->name, currCli->cname, &(currCli->anno)); 
     currCli = currCli + ss; 
    } 
    fclose(fp); 
    return d; 
} 

코드의이 작품은 기본적으로 특정 패턴으로 포맷 라인의 수,과, 텍스트 파일을 읽고 strcut cliente의 배열에 내용을 할당합니다 이것은 코드입니다.

이 내가 할당 이전의 메모리를 해제하는 경우를 제외하고, 잘 작동하는 것 같다 :

int main() { 
    int x,i; 


    cliente *f = readcostumers("c:/temp/clienti.txt",&x); 
    int len = sizeof(cliente); 
    for(i=0; i<x; i++) {   
     printf("\n%s %s %s %d",(f + len*i)->code, (f + len*i)->name, 
       (f + len*i)->cname, (f + len*i)->anno);  
    } 
    free(f); 
} 

마지막 문장은 무료 (f)에 인쇄 된 값은 파일의 올바른 읽기 입력해도하는 SIGTRAP 예외가 발생합니다.

A3789 Paolo Rossi 2001 
X478D Marcantonio Bianchi 2004 

어디 실수 :

파일의 내용이 무엇입니까? 당신이 readcostumerscurrCli를 증가하면

답변

1

당신은 1를 사용해야하고 main에 당신은 len으로 인덱스를 곱하면 안된다. 이것들은 언어로 처리됩니다. 이 두 가지 오류는 서로 보완 적이지만 할당 된 메모리 외부에서 액세스하고 있으며 힙 할당 알고리즘의 내부 관리를 덮어 쓰는 경우가 많습니다. 결국 free에 충돌이 발생합니다.

valgrind 도구를 보면 이러한 종류의 오류를 완벽하게 찾을 수 있습니다.

0

여기서 뭐하고 있니?

currCli = currCli + ss; 

할당 한 배열의 요소 크기가 아니라 포인터를 1 씩 증가시켜야합니다. (이 언어는 가리키는 객체의 크기만큼 포인터 추가를 자동으로 조정합니다.) 할당 된 영역 외부로 쓰게되고 이로 인해 메모리가 손상되고 SIGTRAP 또는 코어 덤프 또는 기타 유사한 문제가 발생합니다.

관련 문제