왜이 간단한 함수로 인해 seg fault가 발생합니까?fclose() seg 오류
int main(int argc, char** argv) {
FILE* file1;
file1 = fopen(argv[argc + 1], "wt");
fclose(file1);
}
왜이 간단한 함수로 인해 seg fault가 발생합니까?fclose() seg 오류
int main(int argc, char** argv) {
FILE* file1;
file1 = fopen(argv[argc + 1], "wt");
fclose(file1);
}
argv
의 마지막 요소 다음에 두 요소에 액세스합니다. 또한 반환 값 fopen()
을 확인하지 않으면 segfault가 발생할 수 있습니다.
fopen()
은 파일을 열지 못하기 때문에 fp
은 NULL이므로 fclose()
은 충돌로 인해 정당한 반대를 나타냅니다. fopen()
에서 반품 확인하십시오.
또한, 정의상, argv[argc] == 0
및 argv[argc+1]
은 어레이의 끝을 넘는다. 실제로 유닉스 시스템에서는 첫 번째 환경 변수가 name=value
일 수 있지만 유효한 파일 이름은 아닐 가능성이 크며 합법적 인 방법으로는 얻지 못했다.
./a.out file.txt
다음 파일 이름이 argv[1]
입니다;로
프로그램이 호출하는 경우 argv[0]
이 가리키는 문자열은 프로그램의 이름이며 a.out
은 경로 정보를주고받습니다. argc == 2
과 argv[2] == 0
입니다. 파일을 열기 전에 argc == 2
을 확인하는 것을 잊지 마십시오.
항상 반환 상태, 특히 fopen()
과 같은 '실패한 것으로 알려져 있음'기능에서 확인하십시오. argc
이 예상 한 값으로 설정되어 있는지 확인한 후 열어 놓은 이름을 인쇄하십시오. 문제에 대해 많이 알았을 것입니다.
왜 argv []의 끝에서 액세스하고 있습니까? –
이 프로그램을 './a.out file.txt'처럼 실행하고 싶습니다. – Shen
'argc'는'argv []'의 원소의 수이므로'argv'는'0'에서'argc-1'까지의 유효한 원소를 가지고 있습니다. –