2012-02-28 4 views
0

왜이 간단한 함수로 인해 seg fault가 발생합니까?fclose() seg 오류

int main(int argc, char** argv) { 
    FILE* file1; 
    file1 = fopen(argv[argc + 1], "wt"); 
    fclose(file1); 
} 
+2

왜 argv []의 끝에서 액세스하고 있습니까? –

+0

이 프로그램을 './a.out file.txt'처럼 실행하고 싶습니다. – Shen

+0

'argc'는'argv []'의 원소의 수이므로'argv'는'0'에서'argc-1'까지의 유효한 원소를 가지고 있습니다. –

답변

2

argv의 마지막 요소 다음에 두 요소에 액세스합니다. 또한 반환 값 fopen()을 확인하지 않으면 segfault가 발생할 수 있습니다.

3

fopen()은 파일을 열지 못하기 때문에 fp은 NULL이므로 fclose()은 충돌로 인해 정당한 반대를 나타냅니다. fopen()에서 반품 확인하십시오.

또한, 정의상, argv[argc] == 0argv[argc+1]은 어레이의 끝을 넘는다. 실제로 유닉스 시스템에서는 첫 번째 환경 변수가 name=value 일 수 있지만 유효한 파일 이름은 아닐 가능성이 크며 합법적 인 방법으로는 얻지 못했다.

./a.out file.txt 

다음 파일 이름이 argv[1]입니다;로

프로그램이 호출하는 경우 argv[0]이 가리키는 문자열은 프로그램의 이름이며 a.out은 경로 정보를주고받습니다. argc == 2argv[2] == 0입니다. 파일을 열기 전에 argc == 2을 확인하는 것을 잊지 마십시오.

항상 반환 상태, 특히 fopen()과 같은 '실패한 것으로 알려져 있음'기능에서 확인하십시오. argc이 예상 한 값으로 설정되어 있는지 확인한 후 열어 놓은 이름을 인쇄하십시오. 문제에 대해 많이 알았을 것입니다.