programing

전달된 배열의 C 크기

sourcejob 2023. 8. 2. 09:02
반응형

전달된 배열의 C 크기

중복 가능성:
(배열을 가리키는 포인터)의 크기를 찾는 방법

컴파일 시 연산자의 크기를 평가하여 상수로 대체하는 것으로 알고 있습니다.그렇다면, 프로그램의 다른 지점에서 다른 배열을 통과하는 함수가 어떻게 크기를 계산할 수 있습니까?함수에 매개 변수로 전달할 수 있지만, 굳이 추가할 필요가 없다면 다른 매개 변수를 추가할 필요가 없습니다.

다음은 제가 요구하는 바를 설명하는 예입니다.

#include <stdio.h>
#include <stdlib.h>

#define SIZEOF(a) ( sizeof a / sizeof a[0] )


void printarray( double x[], int );

int main()
{
        double array1[ 100 ];


        printf( "The size of array1 = %ld.\n", SIZEOF( array1 ));
        printf( "The size of array1 = %ld.\n", sizeof array1 );
        printf( "The size of array1[0] = %ld.\n\n", sizeof array1[0] );

        printarray( array1, SIZEOF( array1 ) );

        return EXIT_SUCCESS;
}


void printarray( double p[], int s )
{
        int i;


        // THIS IS WHAT DOESN"T WORK, SO AS A CONSEQUENCE, I PASS THE 
        // SIZE IN AS A SECOND PARAMETER, WHICH I'D RATHER NOT DO.
        printf( "The size of p calculated = %ld.\n", SIZEOF( p ));
        printf( "The size of p = %ld.\n", sizeof p );
        printf( "The size of p[0] = %ld.\n", sizeof p[0] );

        for( i = 0; i < s; i++ )
                printf( "Eelement %d = %lf.\n", i, p[i] );

        return;
}

마법의 해결책은 없습니다.C는 반사적인 언어가 아닙니다.물체는 자동적으로 그들이 무엇인지 알지 못합니다.

하지만 선택의 폭이 넓습니다.

  1. 매개 변수를 추가
  2. 매크로로 통화를 래핑하고 자동으로 매개 변수 추가
  3. 더 복잡한 개체를 사용합니다.동적 배열과 배열 크기를 포함하는 구조를 정의합니다.그런 다음 구조물의 주소를 전달합니다.

함수 매개 변수에는 실제로 배열 유형이 없습니다.컴파일러가 볼 때

void printarray( double p[], int s )

아니 심지어는

void printarray( double p[100], int s )

둘 중 하나를 로 변환합니다.

void printarray( double* p, int s )

그렇게sizeof(p)이라sizeof(double*)그리고 네, 크기를 매개 변수로 전달해야 합니다.

문제는 함수가 배열 값을 수신하지 않고 포인터 값을 수신한다는 것입니다.

그것이 피연산자일 때를 제외하고는.sizeof신탁의&연산자, 또는 선언에서 다른 배열을 초기화하는 데 사용되는 문자열 리터럴, 유형 "array"의 표현입니다.T유형 "로 변환됩니다.T이 값은 배열의 첫 번째 요소의 주소가 됩니다.

그러므로, 당신이 전화할 때.printarray의 종류array1은 "100-dll 배열"에서 암시적으로 변환됩니다.double"에 대해 설명합니다.double따라서 모수의 유형은p이라double *,것은 아니다.double [100].

함수 매개변수 선언의 맥락에서,T a[]와 동일합니다.T *a.

따라서 어레이 크기를 별도로 전달해야 합니다.

당신은 당신의 질문에 대답했습니다.컴파일 시간에 계산되는데, 어떻게 'size of p'가 런타임 동안 두 개 이상의 값을 가질 수 있습니까?

길이를 매개 변수로 전달하는 것은 좋은 해결책입니다. 그렇지 않으면 배열이 항상 문자열 및 null 바이트와 같은 특수 값으로 끝나도록 할 수 있습니다.

문자열을 처리하는 방식인 센티널 값을 사용할 수 있습니다.단점은 전체 어레이에서 크기를 확인하기 위해 반복해야 한다는 것입니다.

예를 들어 다음과 같은 문자열이 있는 경우:

char s1[] = "foobar";

실제로 사용할 수 있는 것은 길이 7의 배열로, 일곱 번째 점은 배열/문자열의 끝을 나타내는 null 끝 문자 '\0'입니다.

또 다른 방법은 크기와 배열로 구성된 구조체를 만드는 것입니다.

다음 중 하나를 선택해야 합니다.

  1. 배열 크기를 함수에 매개 변수로 전달
  2. 배열이 알려진 값으로 끝나는지 확인하고 해당 값에 도달하면 중지합니다.

배열이 null로 종료된 경우 배열을 반복하여 마지막 값을 찾을 수 있습니다.C의 많은 문자열 연산자는 그런 식으로 작동합니다.

그렇지 않으면 선택의 여지가 없습니다.

size of는 p의 크기를 반환합니다. p는 포인터이며 int 크기와 같습니다.

언급URL : https://stackoverflow.com/questions/5493281/c-sizeof-a-passed-array

반응형