2011-11-11 5 views

답변

8

C 표준은 지정

argv[argc] shall be a null pointer. 

그래서 당신은 항상 0을 테스트하여 끝을 감지 할 수 있습니다.

2

일반적으로 어레이가 0 또는 NULL과 같은 일부 "중지"값으로 종료되지 않는 한 사용자가 할 수 없습니다. 이것이 argc이 존재하는 이유입니다. 포인터 자체는 길이/개수/요소와 관련된 요소가 없습니다.

배열에 대한 포인터를 전달할 때 반드시 요소 수를 전달하거나 명시 적으로 하나 이상의 요소를 할당하고 배열 끝에 "null"요소를 추가해야합니다.

+2

'argv'는 마지막 요소로'0 '이 보장됩니다. –

+0

@JensGustedt 다시 읽어주십시오. 나는 구체적으로 "일반적으로"라고 말했고 특별히 argv가 아닌 * 모든 배열 *의 맥락에서 대답했다. – meagar

+0

@ meegar, 음, 음, 두 번째 구문은 참조 할 컨텍스트가 많지 않습니다. 'argc'는 편리 성 (또는 전통)을 위해서 존재하며 엄격하게 말하기는 필요하지 않습니다. –

1

수 없습니다. 배열이 끝나면 무작위가 생기고 실제 데이터와 무작위성을 정확히 구별 할 수 없습니다.

+0

잘못되었습니다. 'argv'는 마지막 요소로'0'을 보장합니다. –

+0

좋은 점. 내가 앞으로 나아갈 때 나는 멈춰야했다. – drdwilcox

0

argv를 사용해야합니다. argv는 argv가 제공 될 때 항상 존재해야합니다. argv의 마지막 char 포인터는 argv [argc-1]

+1

틀린,'argv'는 마지막 요소로서'0'을 갖습니다. –

2

입니다. 일부 사람들은 여기에 동의하지 않습니다.

argv 자체가 null로 끝납니다. 예를 들어, 사용자가 입력하는 경우

$./foobar hello strawberry 

당신은 즉

argv = [%p] [%p] [%p] [NULL] 
     |  |  |  
     |  |  \_"strawberry\0" 
     |  | 
     |  \_"hello\0" 
     |  
     \_"./foobar\0" 

은, 코드의 종류가 작동 얻을 것이다 :

while (*argv) { 
    printf("%s\n", *argv); 
    argv++; 
} 

은 그것을 시도하고 볼!

+0

당신은 옌스 주석 당 NULL로 끝나는 것이 당연 하겠지만, 표준을 모른 채 NULL이된다고 가정하면 나쁜 생각입니다. –

+0

[app.execve.01.02] (http://linuxtesting.org/results/lsb_reqs?showreqs=execve) "argv : 응용 프로그램은이 배열의 마지막 멤버가 null 포인터인지 확인해야합니다." –

+0

자, 이제 무방비로 –