2012-02-03 4 views
1

Xcode에서 테스트 C 프로그램을 컴파일하고 실행하려고합니다. 이 프로그램은 텍스트 파일에서 5 개의 기호를 읽고 그것을 닫습니다. 프로그램이 성공적으로 빌드되지만 프로그램을 실행하려고하면 GDB : fclose (in)에서 "EXC_BAD_ACCESS"신호가 수신되었습니다.Xcode 오류 : "EXC_BAD_ACCESS"

#include <iostream> 
#include <unistd.h> 

int main (int argc, const char * argv[]) 
{ 
    bool b; 
    char inpath[PATH_MAX]; 
    printf("Enter input file path :\r\n"); 
    std::cin >> inpath; 
    FILE *in = fopen(inpath, "r+w"); 
    char buf[5]; 
    fread(&buf,sizeof(buf),5,in); 
    printf(buf); 
    fclose(in); 
    return 0; 
} 

무엇이 원인 일 수 있습니까?

+1

printf 출력이 제대로 표시됩니까? –

+1

디버거를 사용하는 방법을 배우는 것은 C 또는 C++ 학습 과정의 일부입니다. –

+0

printf는 어떤 이유로 5 개 이상의 기호를 출력합니다 ... –

답변

3

아! sizeof(buf)은 5를 반환하므로 5 바이트 버퍼에서 25 바이트를 요구합니다. 이렇게하면 자동 저장 장치 및 클리버가 덮어 쓰여집니다. in.

그리고 물론 fprint(buf)은 null을 끝내지 않고 버퍼를 인쇄하려고 시도하므로 읽은 내용의 끝을 넘어 가비지가 인쇄됩니다.

+0

감사합니다. 'char buf [6]에 편집했습니다. fread (& buf, sizeof (buf), 1, in); buf [5] = '\ 0'; printf (buf); 그리고 작동했습니다! ' –

+0

@ JakeBadlands -'fread'가 정의 된 이유를 결코 이해하지 못했습니다. 이중 길이 parms는 혼란스럽고 불필요하며 많은 오류를 유발합니다. –

2

라인

fread(&buf,sizeof(buf),5,in); 

잘못이다 :주의 깊게 man page of fread 읽기 (그리고 sizeof(buf) 전체 buf 배열의 크기가 될 것이라는 점을 기억).

라인

printf(buf); 

은 잘못된 것입니다. 예를 들어 buf에 포함될 동작이 정의되지 않은 경우 %d

확실히 디버거를 사용하고 컴파일러에서 모든 경고를 사용하는 방법을 배워야합니다.

2
fread(&buf,sizeof(buf),5,in); 

이것은 buf 번을 5 번 읽으려고한다고 말합니다.

두 번째 및 세 번째 매개 변수는 fread에 읽고 자하는 각 요소의 크기와 요소 수를 나타냅니다.

관련 문제