2012-12-09 2 views
2

링크 된 목록 개념을 사용하여 프로그램을 만들어야합니다. 그것은 우분투, ideone.com에서 작동하지만, 대학 시험자에게 제출할 때, 세그먼트 오류/버스 오류/메모리 제한 초과/스택 제한 초과 (목록 중 하나)를보고합니다.프로그램이 작동하지만 테스트에서 세그먼테이션 오류가 발생합니다.

아마도 DevCpp 만 떨어지기 때문에 문제는 메모리 할당 해제이며, 무료로 사용하는 코드 조각이 생깁니다.

그래서 Valgrind를 사용했지만 로그에 쓰여진 내용을 이해할 수는 없지만 "크기가 8"이거나 크기가 8입니다. 메모리 할당과 관련이 있습니다. (sizeof 블록은 8이지만 항상 그런 것은 아닙니다). "오류 요약 : 48 개 컨텍스트에서 76 개 오류 (2 개에서 2 개로 제한)"및 "총 힙 사용 : 20 개 할당, 20 개 해제, 160 바이트 할당"(필자는 그 행이 중요하다고 생각합니다.

마지막으로, 문제가 될 가능성이있는 코드가 있습니다.

TITEM *borrowItem(const char *to) 
{ 
    TITEM *newItem = (TITEM *)malloc(sizeof(newItem)); 
    newItem->m_Next = NULL; 
    newItem->m_To=(char *)malloc(sizeof(to)); 
    strcpy(newItem->m_To,to); 
    newItem->m_Cargo = NULL; 
    return newItem; 
} 

문제가 이미 할당되어 있다고 가정합니다. 이 함수는 새 목록 항목 포인터를 만드는 데 사용됩니다. 메모리는 여기 해제 :

void freeItem(TITEM *item) 
{ 
    free(item->m_To); 
    free(item);  
    return;  
} 

m_To은 문자열이고 m_Next은 다음 항목 포인터입니다.

newItem->m_To=(char*)malloc(sizeof(to)); 
strcpy(newItem->m_To,to); 

sizeof(to)의 값이됩니다 포인터가 차지하는 바이트 수 (4, 8) :

+0

당신의 들여 쓰기 (전반적인 코딩) 스타일에주의하십시오, 그것은 그대로 읽을 수있다. 또한,'malloc()'의 반환 값을 형 변환해서는 안되며'void '를 반환하는 함수의 끝에있는'return'은 불필요합니다 (C는 BASIC이 아닙니다). –

답변

4

이 같은 문자열을 복사 할 수 없습니다.

newItem->m_To = malloc(strlen(to) + 1); 
strcpy(newItem->m_To,to); 

또는 본질적으로 같은 일을 수행하는 라이브러리 함수 strdup를 사용

이 작업을 수행해야 하나. 나는 또한 malloc 호출에서 (char*)에 캐스트를 제거

newItem->m_To = strdup(to); 

참고. 다른 malloc 호출에서도 캐스트를 제거해야합니다. 올바른 그러나 가능 불완전이 바로 C 인 경우, 그


딥 스틱 말했다 ...입니다. newItem의 malloc도 단지 포인터의 크기를 할당하지 않는다.

당신이처럼 구조를 할당해야합니다

TITEM *newItem = malloc(sizeof(TITEM)); 
+0

특히 마지막 절의 경우 +1. –

+1

정확하지만 불완전 할 수 있습니다. newItem의 malloc도 단지 포인터의 크기를 할당하지 않는다. – Dipstick

+0

오, 좋은 얼룩짐. 나는 그렇다고 생각한다. 대신'sizeof (TITEM)'이어야합니다. 그것을 내 대답에 추가 할 것입니다. – paddy

관련 문제