전달된 배열의 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는 반사적인 언어가 아닙니다.물체는 자동적으로 그들이 무엇인지 알지 못합니다.
하지만 선택의 폭이 넓습니다.
- 매개 변수를 추가
- 매크로로 통화를 래핑하고 자동으로 매개 변수 추가
- 더 복잡한 개체를 사용합니다.동적 배열과 배열 크기를 포함하는 구조를 정의합니다.그런 다음 구조물의 주소를 전달합니다.
함수 매개 변수에는 실제로 배열 유형이 없습니다.컴파일러가 볼 때
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'입니다.
또 다른 방법은 크기와 배열로 구성된 구조체를 만드는 것입니다.
다음 중 하나를 선택해야 합니다.
- 배열 크기를 함수에 매개 변수로 전달
- 배열이 알려진 값으로 끝나는지 확인하고 해당 값에 도달하면 중지합니다.
배열이 null로 종료된 경우 배열을 반복하여 마지막 값을 찾을 수 있습니다.C의 많은 문자열 연산자는 그런 식으로 작동합니다.
그렇지 않으면 선택의 여지가 없습니다.
size of는 p의 크기를 반환합니다. p는 포인터이며 int 크기와 같습니다.
언급URL : https://stackoverflow.com/questions/5493281/c-sizeof-a-passed-array
'programing' 카테고리의 다른 글
| Angular 2 라우터 이벤트 수신기 (0) | 2023.08.02 |
|---|---|
| com.google.android.gms:play-services를 찾을 수 없습니다. 3.1.59 3.2.25 4.0.30 4.1.32 4.2.40 4.2.42 4.3.23 4.4.525 5.025 5.025 5.0.89 6.1.11 6.71 6.87 (0) | 2023.08.02 |
| 비활성화된 텍스트 상자를 사용한 모델 바인딩 (0) | 2023.08.02 |
| 판다 데이터 프레임에서 이름 없는 열 제거 (0) | 2023.08.02 |
| 데이터 테이블 페이지를 사용하려면 어떻게 해야 합니까? (0) | 2023.08.02 |