2012-06-27 3 views
1

가능한 중복 왜 : 나는 값이 배열에있는 경우 1 초를 반환 함수를 작성하기 위해 노력하고있어
Sizeof an array in the C programming language?배열의 크기는 1

. 여기 코드는 다음과 같습니다

int inArrayInt(int iVal, int iArray[]) 
{ 
    int i; 
    int arrayL = sizeof(*iArray)/sizeof(int); 
    int flag = 0; 
    for(i=0; i < arrayL; i++) 
    { 
     if(iVal == iArray[i]) 
     { 
      flag = 1; 
     } 
    } 
    return flag; 
} 

문제는 arrayL = sizeof(*iArray)/sizeof(int); 항상 배열 (20 개) 요소를 포함하더라도 1로 평가한다는 것입니다. 왜?

답변

2

매개 변수 int iArray[]int *iArray과 같습니다. 당신은 실제로 같은 크기

int arrayL=sizeof(int)/sizeof(int); 

을하고

그래서 당신은

int arrayL=sizeof(*iArray)/sizeof(int); 

을 수행 할 때.

크기 정보를 전달할 매개 변수를 추가해야합니다.

int inArrayInt(int iVal, int iArray[], size_t numel){ 
    ... 
    for(i=0;i<numel;i++){ 
    ... 
    } 
} 
+0

그는 실제로'int arrayL = sizeof (int)/sizeof (int);'를 수행하고 있는데, 코드에 버그가 두 개 있고 주소는 하나뿐입니다. – Lundin

+0

@Lundin'sizeof (* iArray)'는 그다지 틀리지 않습니다. 그리고 설명을 수정으로 적용하면 해당 오류 소스가 제거됩니다. – RedX

1

함수에 전달하는 값은 배열을 가리키는 포인터이며 크기를 알 수있는 방법은 없습니다. 포인터의 크기는 int 크기이므로 1입니다.

반복 할 경우 함수의 인수에 배열의 크기를 전달해야합니다.

+0

을, 내가 어떻게 할 수있는 그것을 해결할 수 있습니까? –

6

배열을 함수로 인수로 전달할 때 포인터가 쇠퇴하기 때문에. 그래서 sizeof(array)은 배열의 크기가 아니라 포인터의 크기를 제공합니다.

배열 크기를 extra argument으로 지정하거나 배열을 reference으로 전달하여 sizeof (배열)로 올바른 크기를 제공 할 수 있습니다. (자세한 내용은 여기 : What is array decaying?)

+3

사이드 넘버로서 OP는'sizeof (* iArray)'를 실행하여 또 다른 오류를 범했습니다. –

1

나는 배열 크기와 추가 매개 변수를 추가 할 것 :

int inArrayInt(int iVal, int* iArray, int sizeOfArray) 
{ 
    int i; 

    for(i = 0; i < sizeOfArray; i++) 
    { 
     if(iVal == iArray[i]) 
     { 
      return 1; 
     } 
    } 

    return 0; 
} 

그런 다음 당신이 배열을 시작한 크기의 함수를 호출 : 그래서

int myArray[100]; 


if (inArrayInt(42, myArray, 100)) 
    //returned true 
관련 문제