2010-06-08 4 views
3

gcc 4.4.4 c89int 배열을 끝내는 nul

나는 int 배열로 실험하고있었습니다. 그리고 무언가가 내 마음에 왔습니다. 내가 그걸 끝낼 수 있을까? 예를 들어, 0에서 nul까지 사용합니다. 그러나 0은이 배열에서 유효한 값일 수 있습니다.

아래 코드는 5 이후에 종료됩니다. 유효한 숫자가 0이더라도. 그러나 배열의 크기를 지정할 수 있습니다. 그러나이 경우, 나는이 특별한 문제에 관심이있는만큼 이것을 원하지 않습니다. 어떤 조언을

많은 감사, 짧은에서

#include <stdio.h> 

static void test(int *p); 

int main(void) 
{ 
    int arr[] = {30, 450, 14, 5, 0, 10, '\0'}; 

    test(arr); 

    return 0; 
} 

static void test(int *p) 
{ 
    while(*p) { 
     printf("Array values [ %d ]\n", *p++); 
    } 
} 
+1

부호없는 값만 저장하는 경우 -1은 좋은 종결 자입니다. while (* p)를 while (* p + 1)로 바꿀 수 있습니다. – schnaader

+2

BTW, '0'과'\ 0 '은'int'를 초기화 할 때 똑같은 것을 의미합니다. –

+4

@schnaader : "* 긍정 * (또는 * 음이 아닌 *) 값만 저장하면 ..."을 의미합니다. –

답변

14

, 아니. 기술적으로 nul 문자는 문자열에서도 똑같이 유효합니다. 문자열의 끝을 표시하는 데 사용하는 규칙 일 뿐이며 모든 표준 라이브러리 함수는이를 기대합니다. 문자열이 \0을 포함해야하는 경우를 위해 \0\0으로 끝나는 "double nul-terminated"문자열이 있습니다. 그러나 물론 문자열에 \0\0을 저장할 수 없다는 문제가 있습니다.

어레이의 크기를 따로 저장하지 않거나 과 같은 속임수를 사용하고 싶지 않으면 해당 유형에 저장할 수 있지만 어레이의 일부가 아닌 것을 알고 있어야합니다 ; arr이 유효한 값으로 설정되어 있지 않은 경우 유효한 값일 수 있습니다.

+0

선택한 마법 번호가 나중에 유효한 마법 번호가된다는 것을 어떻게 알 수 있습니까? 센티넬 값으로 정수의 최대 값을 사용할 수 있습니다. 그것은 C# 또는 Java의 좋은 컨벤션입니다. 그러나 그 가치가 언제나 훌륭한 센티널 가치가 될 수 있다는 것을 알고 있습니까? – David

+1

@David : 항상 훌륭한 센티넬 값은 없으며 때로는 주어진 위치에 대한 센티널 가치가 없습니다. –

+1

센티넬을 사용할 수없는 경우 별도의 변수에 바이트 수를 저장해야합니다 (일반적인 방법이기도 함). –

3

센티넬 값을 사용하려면 분명히 다른 값을 찾아야합니다. 그렇지 않으면 유효한 데이터. 그것은 센티널을 사용하는 단점 중 하나입니다 (다른 하나는 길이를 찾는 데 필요한 선형 검색입니다). 0xFFFF 같은 것을 어떻게 사용할 수 있습니까?

이것이 C++ 인 경우 관련 길이 멤버가있는 클래스를 만드는 것이 좋습니다 (또는 더 나은 방법은 아직 std::vector을 사용하는 것입니다). C의 경우에는 별도의 길이 변수를 직접 유지해야합니다. 원하는 경우 구조체에 배열을 함께 넣을 수 있습니다.

3

간단히 말해서, \ 0은 0과 동일합니다, 그래서 당신은 당신의 배열에 0을 경우 코드는 배열의 마지막에 그런 실수됩니다

int arr[] = {30, 450, 14, 5, 0, 10, '\0'}; 
          ^this is the end of the array 

편집 :의 끝 "에 의해 있습니다 배열 "은 C 프로그래밍 언어에 의해 메모리에 배치 된 데이터의 실제 범위가 아니라 알고리즘에 의해 정의 된 배열의 개념적인 끝을 의미합니다.

1

글쎄, 당신은 또한 \0에서 \\0로 감시 번호를 변경할 수 있습니다. 그리고 이에 따라 while 루프의 조건을 약간 수정하면 문제가 해결됩니다. 이제

while(*p != '\\0') 

, 0은 정수 배열에 대한 종결 전체 배열이 인쇄됩니다로 취급되지 않습니다.

관련 문제