2012-12-03 5 views
0

나는 다음과 같은 코드를 가지고 :변수는 argv [1] 부여 세그먼테이션 폴트 (segfault)

내가 if 문 전체를 꺼내
int main(int argc, char *argv[]) 
{ 
    if(strcmp(argv[1],"-e")==0) 
    { 
    //perform code 
    } 

    //code if argv[1] is not "-e" 

return 0; 
} 

:

if(strcmp(argv[1], "-e")==0) 

내 코드를 경우 STRCMP (변수는 argv [1], "- e ") == 0)는"-e "가 잘 동작하지 않습니다. 하지만이 코드를 그대로두면 위의 if 문이 true가 될 때만 작동합니다. 이것이 일어날 수있는 이유에 대한 아이디어가 있습니까? 예를 들면 : 나는 argv를 컴파일하면

[1] 주석하지 :

// 예제 프로그램은 exampleProgram < a.txt이 아무튼

exampleProgram이 < a.txt이 작품 -e 실행이 될 것이지만 일하지 마라. 어떤 아이디어?

답변

2

간단합니다. 프로그램에 인수를 보내지 않으면 args[1]이없고 할당되지 않은 메모리 위치에 액세스하려고합니다.

당신은 같은 것을 할 수 있습니다

int main(int argc, char *argv[]) 
{ 
    if(argc > 1 && strcmp(argv[1],"-e")==0) 
    { 
    //perform code 
    } 

    //code if argv[1] is not "-e" 

return 0; 
} 
1

변수는 argv 배열이다. 마지막 요소를 넘어 배열로 색인하려고하면 segfault가 생깁니다. 마지막 요소를지나 가지 않으려면 argc의 값을 확인하고 argc - 1은 액세스 할 수있는 마지막 요소의 인덱스가됩니다. 여기 세그먼테이션 폴트 (segfault)에 대한 자세한 : http://en.wikipedia.org/wiki/Segmentation_fault

0

이유
exampleProgram -e < a.txt 작품과 exampleProgram < a.txt는 더 argv[1]없는 프로그램으로 전달되는 인수를가 없을 때, 그것은 인수의 범위를 벗어 때문에하지
는 않습니다 정렬. argv[1]을 테스트하기 전에해야 할 일은 테스트 할 수있는 많은 인자가 있는지 확인하는 것입니다. 예를 들어

:

if (argc > 1) { 
    if(strcmp(argv[1],"-e")==0) { 

    } 
} 

argc는 당신이 경계의 외출하기 전에이 작업을 테스트 할 수 있도록 프로그램에 존재 얼마나 많은 인수를 유지하는 데 사용됩니다.