배열은 단순히 연속적인 메모리 위치의 시리즈입니다. 배열을 탐색하려면 시작 주소와 끝을 찾는 방법 두 가지를 알아야합니다. 끝을 찾기
이
몇 가지 방법으로 수행 할 수 있습니다, 당신은 부여해야합니다
- 끝 주소를 명시 적으로
- 배열
- 끝을 표시하는 데 사용되는 감시 값의 길이 시퀀스
첫 번째 시도에서 printArray(int* arr, int size)
은 두 번째 메커니즘을 사용하고 처음부터 끝까지 메모리 위치를 증가시킵니다.
두 번째 시도 인 printArray(int* arr)
은 "0이 발견 될 때까지 인쇄"라고 간단히 말합니다. 문자열 (char
배열이 null 종결 자로 끝난 경우)이 있지만 int
배열이 있으면이 아이디어가 잘 작동합니다. 그 목록에 0이 있다는 보장이 없으므로 마지막으로 0이 될 때까지 점점 더 많은 메모리 위치를 계속 읽게됩니다.
프로그램 작성은 일반적인 인간 사고 프로세스와 유사합니다. 간단하게 코드를 읽고 의미가 있는지 확인하십시오.
int in[4] = {1, 2, 3, 4}; // I have an array called in, it has 4 numbers: 1, 2, 3, 4
int ret = printArray(in); // I pass that array to the function printArray
...
while (*(arr + i)) { // while the contents of the memory location (array + i) is
// not 0, print the value we find there
갑자기 이것이 작동하지 않는 이유는 매우 분명합니다. 배열에 숫자 0이 들어 있습니까? 아니 ... 그럼 언제 인쇄가 중단 될까요?
Dunno. 일반적으로, 당신은 할 수 없습니다. 센티넬 (sentinel)으로 사용할 수있는 int 집합에 불법적 인 값이 있습니까? -1, 어쩌면? –
왜 이걸 원하니? –
'while (* (arr + i)) {...}'는 버퍼 오버 플로우입니다. 여러분이 의미하지 않았던 메모리로 읽어 들이고'arr + i'가 값' 0'! –