>백엔드 개발 >C++ >C에서 배열을 함수에 전달할 때 sizeof()가 다르게 동작하는 이유는 무엇입니까?

C에서 배열을 함수에 전달할 때 sizeof()가 다르게 동작하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-11 17:56:031053검색

Why Does sizeof() Behave Differently When Passing Arrays to Functions in C  ?

C에서 함수에 배열을 전달할 때 sizeof() 이상

C에서 sizeof() 연산자는 배열과 관련하여 다르게 작동합니다. 메인 함수에서 사용될 때보다 함수에 전달됩니다. 이러한 불일치는 초보자에게 혼란스러울 수 있습니다.

올바른 배열 전달

배열을 함수에 올바르게 전달하려면 다음을 사용하여 참조로 전달하는 것이 중요합니다. 구문:

int length_of_array(int (&arr)[N]);

여기서:

  • arr은 함수에 전달되는 배열입니다.
  • N은 다음을 나타내는 정수 상수입니다. 배열의 크기.

Sizeof() 사용 함수

함수 내에서 sizeof()를 사용할 때 다음이 적용됩니다.

sizeof(arr) == N * sizeof(int);

설명:

  • sizeof(arr)는 배열에 할당된 총 메모리 크기를 반환합니다. 이는 각 요소 크기의 N배입니다. (sizeof(int)).

잘못된 배열 전달 문제

제공된 코드 조각에서 length_of_array() 함수가 실수로 포인터로 배열을 전달합니다. , 좋다 this:

int length_of_array(int some_list[]);

이 잘못된 전달 방법으로 인해 다음 문제가 발생합니다.

  • sizeof(some_list)는 첫 번째 요소에 대한 포인터의 크기를 반환합니다. 배열.
  • sizeof(*some_list)는 배열에 있는 단일 요소의 크기를 반환합니다.
  • 실제 배열 크기에 관계없이 이러한 값을 나누면 항상 1이 됩니다.

템플릿을 사용한 해결 방법

이 제한을 극복하려면 다음과 같은 템플릿 기반 접근 방식을 사용할 수 있습니다. this:

template<size_t N>
int length_of_array(int (&amp;arr)[N])
{
    std::cout << N << std::endl; // Will output the correct array size
    return N;
}

핵심 사항:

두 방법의 근본적인 차이점은 배열을 참조로 전달하는 것과 포인터로 전달하는 것입니다. 전자는 배열 크기에 대한 정보를 유지하지만 후자는 그렇지 않습니다.

위 내용은 C에서 배열을 함수에 전달할 때 sizeof()가 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.