2012-06-13 9 views
33

그래서 명령 줄 매개 변수가 항상 null로 종료되는지 궁금합니다. Google은 그렇다고 말하며, GCC에서 컴파일하는 것은 이것이 사실임을 나타냅니다. 그러나 이것이 항상 사실임을 보장 할 수 있습니까?기본 null의 char * argv [] 인수가 종료 되었습니까?

int main(int argc, char** argv) 
{ 
    char *p; 

    for(int cnt=1; cnt < argc; ++cnt) 
    { 
     p = argv[cnt]; 
     printf("%d = [%s]\n", cnt, p); 
    } 
    return 0; 
} 

$ MyProgram -arg1 -arg2 -arg3 
1 = -arg1 
2 = -arg2 
3 = -arg3 
+4

예, 그렇습니다. – kol

+2

잠시 생각해보십시오. * NULL이 끝나지 않은 경우 어떻게 될까요? * –

+0

잠깐 생각 해봐 ... char []와 char *는 자동으로 C 스타일 문자열을 암시하지 않습니다. 분명히 전체 명령 줄 문자열은 NULL로 끝나지 만 NULL이 끝나는 명령 줄에서 전달 된 각 개별 문자 배열로 변환 할 필요는 없습니다. argv가 명령 행에서 공백을 제거하고 C 스타일 문자열이 아닌 널 문자가 아닌 문자 배열을 갖는 것만으로도 충분합니다. – LeviX

답변

56

예. argv 배열의 포인터는 C 문자열을 가리키며, 정의에 따라 null이 종료됩니다.

C 언어 표준은 단순히 배열 구성원이 "문자열에 대한 포인터를 포함해야합니다"(C99 §5.1.2.2.1/2)라고 명시합니다. 문자열은 "첫 번째 null 문자로 끝나는 연속 문자 시퀀스"(C99 §7.1.1/1)입니다. 즉, 정의에 의해 null로 끝납니다.

또한 argv[argc]의 배열 요소는 null 포인터이므로 배열 자체도 의미 상 "null로 끝납니다."

+0

argv가 null로 종료되면 argc의 사용법을 설명 할 수 있습니까? 우리는 안된다. '\ 0'에 도달 할 때까지 배열을 횡단하여 인수 인수를 얻습니다. – Snehasish

+0

@Snehasish 예, argv에서 argc를 계산할 수 있습니다. 왜'main'에 서명이되어 있는지에 대해서는 확실하지 않습니다. 내가 존재하기 전부터 이런 식으로되어 왔습니다. –

+0

그럼, 그 역사적 이유로 ... – Snehasish

4

예. 인수가 널로 끝나는 문자열 인 경우에는 항상 true입니다.