2016-12-29 2 views
1

발췌 :계산를 sizeof()를 사용

표현은 sizeof(data)/sizeof(data[0])에서, 배열 data의 크기를 반환

는 몇 가지 경우가, 그래서이 아닌 장소에서 사용하지 마십시오 이러한 구조에서. (C 프로그래머가 나와 함께 동의 할 것이다!)

배열 크기를 얻으려면, 내가 봤는데 모든 기본 형식이 표현 sizeof(data)/sizeof(data[0]) 모든 시간을 사용하여 .

위의 표현이 일 때을 사용해서는 안되는 모든 사례에 대해 알고 계시나요?

+0

'std :: vector' 또는'std :: array'를 사용하면 작동하지 않을 때 신경 쓰지 않아도됩니다. – crashmstr

+0

예, 저는 C++로 사용합니다. 그러나 여러 번, 나는이 표현을 사용하는 C에서도 코드를 작성합니다. 이 문제는 특정 언어입니까? –

+0

나는 typesafe가 없다고 생각한다 – SebNag

답변

4

data 경우과 같이 선언했다 : 그것을 위해

int *data; 

그리고 공간과 같이 할당 :

data = malloc(NUM_ELEMENTS * sizeof(int)); 

그런 다음 기술이 작동하지 않습니다, sizeof(data)포인터의 크기가 있기 때문에 배열의 내용이 아닌.

4

sizeof 접근 방식은 포인터 또는 불확정 크기의 배열을 제공 할 때 컴파일되지만 작동하지 않습니다.

배열에 size()를 사용
template <typename T, std::size_t N> 
constexpr std::size_t size(T(&)[N]) { 
    return N; 
} 

가 제대로 작동 : 그냥 적절한 C++ 접근 방식을 사용합니다. 예를 들어 포인터에 적용 할 수없는 경우에 사용하는 것은 컴파일 타임 오류입니다.

+0

아니면'C++ 11'' std :: extent :: value' 이후로 더 쉽다. – SebNag

+0

고맙다. T (&) [N]'즉'&'인자로 괄호 안쪽에? 그것을 처음으로 보아라. 내가해야 할 용어, 힌트는 무엇입니까? –

+1

@SebTu : 어떻게 든'size (array)'는'std :: extent :: value'보다 의도 한 것을보다 명확하게 표현하고 입력하는 것이 더 쉽다고 생각합니다. –

0

정적 배열에 대한 기술 수정 작업의 크기는 아무런 문제가 없습니다. 위의 동적 배열 및 포인터 데이터에서 언급했듯이 올바르게 작동하지 않습니다.