2014-02-13 2 views
0

스 니펫을 첨부하고 있습니다. 나는 많이 싫어했다. 필요한 경우 좀 더 첨부합니다Segfault - 유효하지 않은 포인터

unsigned char *datap = malloc (MAXSIZE); 
unsigned char *datapor = datap; 
//Here Im cutting a lot 
while((direntp = readdir(dirp)) != NULL) 
{ 
    datap = datapor; 
} 
//this line gives me exception 
free(datap); 

GCC 쇼 :

*** glibc detected *** /home/xf/xf/unzipper: free(): invalid pointer: 0x00002aaaab0b0108 *** 
+4

당신이 많은으로 절단 것 같다 (I는 생략 된 코드 datapor 변경.의 값이 있다고 가정하고). 표시하는 코드는 메모리 관리를 엉망으로 만들어서는 안됩니다. 'datall'과'datap'에 대한 각각의 연산을'malloc()'과'free()'사이에 보여주고 싶을 수도 있습니다. – alk

+2

valgrind valgrind valgrind! – Dariusz

답변

0

귀하의 malloc 때문에 매크로 MAXSIZE 실패있을 수 있습니다. 충분한 메모리가 없다면 실패 할 수 있습니다.

datap = malloc (MAXSIZE)이 실행 가능한 포인터인지 확인하기 시작하십시오.

unsigned char *datap = malloc (MAXSIZE); 
if (datap == NULL) 
    return -1; //malloc failed 
+2

그래, 좋은 연습일지도 모르지. 문제가 아니야. –

+0

malloc의 반환 값을 검사하는 것은 좋은 조언이지만 free (NULL)는 오류를 설명하지 않으므로 완벽하게 유효합니다. –

+0

-1은'free()'의'NULL'-check을 추천하기 위해 필요합니다. 또한이 코드는 이상한 철자의'If' 키워드를 사용합니다. :) – unwind

2
당신은 당신의 while 루프에서 datap를 재 할당

, 그래서 당신은 할당 된 메모리에 free, datap 더 이상 포인트를 호출하지 않는 경우.

+0

그러나 데이터 저장소는 datap의 초기 값으로 설정됩니다.이 값은 malloc에서 반환 된 값이며 나중에 변경되지 않습니다. 따라서 모든 while 루프는 반복적으로 datap을 malloc에서 반환 된 값과 동일한 값으로 설정합니다. –

+0

@Nigel 동일한 값을 반복적으로 할당하는 것은 의미가 없기 때문에 생략 된 코드에서 'datapor'의 값이 변경된다고 가정했습니다. –

+0

당신은 맞을지도 모르지만 IMHO는 그 가정이 답의 일부가되어야합니다. 그 답으로 당신의 대답은 표시된 코드를 참조하는 것으로 보이며, 그저 잘못된 것입니다. –

관련 문제