2013-12-03 1 views
2

을 모르고, 배열을 인쇄?나는이 기능이 크기

L.E.

int printArray(int* arr) { 

    int i = 0; 
    while (*(arr + i)) { 
     printf("%d, ", *(arr + i++)); 
    } 

    return EXIT_SUCCESS; 
} 

하지만 모든 출력이 세 가지 알 수없는 값 뒤에 : 나는 이런 식으로 뭔가하려고 노력 (에 : 1 2 3 4; : 1 2 3 4 343443 -432244 324333)를.

감사합니다.

+1

Dunno. 일반적으로, 당신은 할 수 없습니다. 센티넬 (sentinel)으로 사용할 수있는 int 집합에 불법적 인 값이 있습니까? -1, 어쩌면? –

+1

왜 이걸 원하니? –

+1

'while (* (arr + i)) {...}'는 버퍼 오버 플로우입니다. 여러분이 의미하지 않았던 메모리로 읽어 들이고'arr + i'가 값' 0'! –

답변

2

당신은 마지막 요소에 주소를 전달할 수 :

int printArray(int* arr, int* end) { 

    do { 
     printf("%d, ", *arr); 
    } while((arr++) != end); 

    return EXIT_SUCCESS; 
} 
1

센티넬 값을 추가하십시오. 당신이 아는 가치는 항상 마지막 것입니다. int는 터프하지만 -1과 0은 가장 좋아하는 값입니다.

+2

'INT_MAX' (또는'INT_MIN')도 옵션입니다. – Kninnug

1

배열은 단순히 연속적인 메모리 위치의 시리즈입니다. 배열을 탐색하려면 시작 주소와 끝을 찾는 방법 두 가지를 알아야합니다. 끝을 찾기

몇 가지 방법으로 수행 할 수 있습니다, 당신은 부여해야합니다

  1. 끝 주소를 명시 적으로
  2. 배열
  3. 끝을 표시하는 데 사용되는 감시 값의 길이 시퀀스

첫 번째 시도에서 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이 들어 있습니까? 아니 ... 그럼 언제 인쇄가 중단 될까요?

관련 문제