2016-08-17 2 views
0

문제가 있습니다. 내가 char*을위한 공간을 할당하고 있지만, free에 노력 중이면 프로그램이 다운됩니다. char 포인터 메모리를 비우지 못했습니다. C

free 할 때

fullPath = (char *) malloc(strlen(path) + strlen(fileData->d_name) + 1); 
if (fullPath == NULL) 
{ 
    handleErrors(ERR_ALOCATION_CODE); 
} 
sprintf(fullPath, "%s/%s", path, fileData->d_name); 
//... some more code, I only use fullPath, I don't change it here 
free(fullPath); 

위의 코드는 실패 코드입니다. 나는 약간의 도움에 감사 할 것입니다.

+6

당신은 또한 null을 종료하기 위해 메모리를 할당해야합니다 ... –

+0

나는 당신이 호출 한 함수 중 하나가'fullPath'의 메모리에 대한 포인터를 저장하고 있다고 의심합니다. 해지 된 후에 액세스하려고합니다 (실패한 경우). – Alexander

+0

'malloc (strlen (path) + 1/*'/ '*/+ strlen (fileData-> d_name) + 1)/* null * /); ' – chux

답변

5

NUL 문자를 종료하는 문자열의 공간을 할당하지 않습니다.

// allocate memory for 1st part, slash, 2nd part and terminating NUL char 
fullPath = malloc(strlen(path) + 1 + strlen(fileData->d_name) + 1); 

참고 또한, C에이 malloc의 반환 값을 캐스팅 나쁜 연습, 그래서 나는 그것을 제거 : 그래서 여기에 할당을 변경합니다.


하지만이 경우에는 의견의 문제가 될 수있다, 경우에 당신은 잘못된 길이를 계산 snprintf을 사용하여 개선 될 수 있습니다. 어쨌든, 다음 코드는

// size for 1st part, slash, 2nd part and terminating NUL char 
size_t bufsize = strlen(path) + 1 + strlen(fileData->d_name) + 1; 
fullPath = malloc(bufsize); 
//... 
snprintf(fullPath, bufsize, "%s/%s", path, fileData->d_name); 

는 그런 버그가 정의되지 않은 동작 발생하지 것이다 될 것이다, 대신 끝에서의 다진 문자와 경로를 생성한다. 이것은 파일 이름을 인쇄하고 어떻게 옳지 않은지를 볼 수있을 때 디버깅하기가 훨씬 쉬우면서도 랜덤 크래쉬보다 훨씬 좋은 오류 상황 (파일을 찾을 수없는 오류)입니다.


일부 설명 : 당신이 너무 적은 1 바이트를 할당하기 때문에 질문의 코드에서, 당신은 너무 기본적으로 어떤 일이 일어날 수 정의되지 않은 동작 인 overlow 버퍼 원인이된다. 1 바이트 버퍼 오버 플로우의 경우, 아무런 문제가 발생하지 않을 가능성이 높습니다. 은 할당이 끝날 때 사용되지 않은 바이트가 될 수 있습니다. 이렇게 당신은 이것을 아주 일찌기 붙잡아서 진짜 운이 좋다. 문자열 길이가 16의 배수이고 다른 경우에만 프로그램이 충돌 할 때 버그를 찾는 것이 얼마나 힘든지 상상할 수 있습니다. 다행히도 이와 같은 것을 탐지하는 도구가 있지만 최선의 방어는 현자 C 프로그래머가되는 것입니다 , 누가 좋은 코드를 작성하기 위해 노력하고 ...

+0

당신은 절대적으로 옳습니다. 문제가 해결되었습니다. –