기본적으로 argc 함께 올라오고있다. ... 실제로 argc하지 않고C 배열의 끝에 도달했을 때 어떻게 알 수 있습니까? (구체적으로 argv)
주어진 argv 경우 본질적으로 각각의 관련 char 배열에 대한 포인터 배열을 이해합니다 입력 된 인수,
실제로 argv에서 포인터의 수를 계산하면 어떻게 될까요?
기본적으로 argc 함께 올라오고있다. ... 실제로 argc하지 않고C 배열의 끝에 도달했을 때 어떻게 알 수 있습니까? (구체적으로 argv)
주어진 argv 경우 본질적으로 각각의 관련 char 배열에 대한 포인터 배열을 이해합니다 입력 된 인수,
실제로 argv에서 포인터의 수를 계산하면 어떻게 될까요?
C 표준은 지정
argv[argc] shall be a null pointer.
그래서 당신은 항상 0
을 테스트하여 끝을 감지 할 수 있습니다.
일반적으로 어레이가 0
또는 NULL
과 같은 일부 "중지"값으로 종료되지 않는 한 사용자가 할 수 없습니다. 이것이 argc
이 존재하는 이유입니다. 포인터 자체는 에 길이/개수/요소와 관련된 요소가 없습니다.
배열에 대한 포인터를 전달할 때 반드시 요소 수를 전달하거나 명시 적으로 하나 이상의 요소를 할당하고 배열 끝에 "null"요소를 추가해야합니다.
수 없습니다. 배열이 끝나면 무작위가 생기고 실제 데이터와 무작위성을 정확히 구별 할 수 없습니다.
잘못되었습니다. 'argv'는 마지막 요소로'0'을 보장합니다. –
좋은 점. 내가 앞으로 나아갈 때 나는 멈춰야했다. – drdwilcox
argv를 사용해야합니다. argv는 argv가 제공 될 때 항상 존재해야합니다. argv의 마지막 char 포인터는 argv [argc-1]
틀린,'argv'는 마지막 요소로서'0'을 갖습니다. –
입니다. 일부 사람들은 여기에 동의하지 않습니다.
argv 자체가 null로 끝납니다. 예를 들어, 사용자가 입력하는 경우
$./foobar hello strawberry
당신은 즉
argv = [%p] [%p] [%p] [NULL]
| | |
| | \_"strawberry\0"
| |
| \_"hello\0"
|
\_"./foobar\0"
은, 코드의 종류가 작동 얻을 것이다 :
while (*argv) {
printf("%s\n", *argv);
argv++;
}
은 그것을 시도하고 볼!
당신은 옌스 주석 당 NULL로 끝나는 것이 당연 하겠지만, 표준을 모른 채 NULL이된다고 가정하면 나쁜 생각입니다. –
[app.execve.01.02] (http://linuxtesting.org/results/lsb_reqs?showreqs=execve) "argv : 응용 프로그램은이 배열의 마지막 멤버가 null 포인터인지 확인해야합니다." –
자, 이제 무방비로 –
'argv'는 마지막 요소로'0 '이 보장됩니다. –
@JensGustedt 다시 읽어주십시오. 나는 구체적으로 "일반적으로"라고 말했고 특별히 argv가 아닌 * 모든 배열 *의 맥락에서 대답했다. – meagar
@ meegar, 음, 음, 두 번째 구문은 참조 할 컨텍스트가 많지 않습니다. 'argc'는 편리 성 (또는 전통)을 위해서 존재하며 엄격하게 말하기는 필요하지 않습니다. –