2014-03-24 2 views
-2

배열에 대한 포인터를 취하여 그 크기를 반환하는 짧은 함수를 작성하려고합니다. 지금까지 내가 가지고있는 것은 다음과 같습니다 :함수에서 C 배열의 크기를 찾으십시오.

int main (void) { 
    double MyArray[3] = {0, 1, 2}; 

    int Temp = ArraySize(MyArray); 

    return 0; 
} 

int ArraySize(double * MyArray) { 
    return sizeof(MyArray)/sizeof(*MyArray); 
} 

그러나 이것은 작동하지 않는 것 같습니다. 아무 도움도받지 못했습니다. Jack

+1

질문에 대답하기 전에 몇 번이나이 질문에 대한 질문을 던지십시오. :) – legends2k

+0

빠른 모양이 있지만 아무 것도 내 질문과 일치하지 않는 것 같습니다. 내 잘못이야. – JMzance

답변

0

아니요, 가능하면 배열에 함수의 길이를 전달해야합니다. 좋아요,

int ArraySize(double * MyArray, size_t length) 
+0

함수의 서명이 OP의 요구 사항에 맞지 않으므로 응답이 답이 아닙니다. –

+0

처음 네 단어는 "No it is not"입니다. 나머지는 여분이다. 배열 끝 부분에 센티널을 배치하지 않으면 (C 문자열의 작동 방식과 유사). 또한 인터페이스가 함수로 변경됩니다. –

+0

@richard 흠, 알았어. –

0

원하는 것을 수행 할 수 없습니다. 함수 ArraySize의 은 double의 배열이 아닌 double에 대한 포인터입니다. 명시 적으로 배열 길이를 배열의 기본 주소와 함께 전달해야합니다.

3

불가능합니다. 포인터는 단순히 배열의 첫 번째 요소를 가리 킵니다. 배열 크기를 추출 할 방법이 없습니다.

당신은 참조로 배열을 전달하고, 템플릿 매개 변수로 크기를 추정 할 수있다 : (당신이 당신의 예에서처럼) 당신은 배열 자체에 액세스 할 수있는 경우

template <typename T, size_t N> 
size_t ArraySize(T (&)[N]) {return N;} 

이에만 작동합니다. 이미 포인터로 쇠퇴 한 경우 크기 정보가 손실됩니다.

+0

좋아요! 그 트릭, 내가 어떻게 작동하는지 이해할 수 있는지 확인할 수 있습니다 ... 당신이 함수에 배열을 전달하면 배열 호출 시간을 알아낼 수 있고 함수에서 액세스 할 수 있습니까? – JMzance

+1

@JackMedley : 맞습니다. 템플리트는 함수 인수의 (배열) 유형에서 요소 유형과 배열 크기를 유추합니다. –

관련 문제