[C/C++]sizeof 사용 없이 배열의 sizeof 찾기

2023. 1. 29. 19:55프로그래밍

728x90

 

 

How to find sizeof array in C/C++ without using sizeof? - Aticleworld

In C language we can calculate the size of an array without using the sizeof() operator with the help of pointer arithmetic operation.

aticleworld.com

sizeof를 사용하지 않고 C/C++에서 배열의 sizeof를 찾을 수 있는 방법이 있을까요?

 

포인터는 pointer의 도움으로 모든 작업을 쉽게 수행할 수 있는 놀라운 C 언어 도구 중 하나입니다. 이전 기사에서 sizeof() 연산자를 사용하지 않고 구조체의 크기를 계산하는 방법을 알아 보았습니다.

 

이 글에서는 sizeof() 연산자를 사용하지 않고  배열의 sizeof를 계산하고 있습니다. sizeof() 연산자를 사용하지 않고 c에서 배열의 크기를 계산하는 것은 어려운 것처럼 보이지만 포인터 산술의 도움으로 쉽게 할 수 찾을 수 있습니다.

 

C 언어에서 포인터를 늘리거나 줄일 때 포인터는 다음 또는 이전 메모리 위치를 가리킵니다. 다음 또는 이전 위치는 포인터 유형에 따라 다릅니다. pfData가 float에 대한 포인터이고 float 크기가 4바이트라면 다음 위치는 현재 위치보다 4바이트 앞선 위치가 될 것입니다.

대표사진 삭제

사진 설명을 입력하세요.

요소의 데이터 유형을 모른 채 배열의 항목 개수(배열 크기)를 계산하는 몇 가지 예제 프로그램을 살펴 봅시다.

 

예제 프로그램 1:

#include <stdio.h>
int main(int argc, char *argv[])
{
    int iTotalElement = 0 ;
    int  aiData[] = {10, 20, 30, 40, 50, 60};
    //Calculate numbers of elements using pointer arithmetic
    iTotalElement = *(&aiData + 1) - aiData;
    printf("Number of element = %d",iTotalElement);
    return 0;
}
 

결과:

위의 개념을 이해하기 전에 배열과 포인터의 관계를 되돌아 보도록 하겠습니다.

 

aiData가 정수 배열이면 &aiData[i]는 정수에 대한 포인터가 되고, 그 값은 i번째 항목의 주소라고 가정해 봅시다. 우리는 이 문장을 수학적 형식으로 표현할 수도 있습니다.

aiData[i] = *(aiData + i);
*(aiData + i) = aiData[i];
(aiData + i) = &aiData[i];
 

i의 값이 0 이라면,

 

이 말은 배열 이름이 첫 번째 항목 주소임을 뜻합니다.

대표사진 삭제

사진 설명을 입력하세요.

참고: 하지만 배열 이름 앞에 앰퍼샌드(&)를 넣으면 유형이 변경 되는 데, 이는 배열에 대한 포인터가 됩니다.

 

요컨대 우리는 이것을 다음과 같이 표현 할 수 있습니다.

aiData ====> 배열의 첫 번째 요소에 대한 포인터.

&aiData ====> 6개 항목을 가진 배열에 대한 포인터.

&aiData + 1 ====> 다음 메모리 블록의 주소(정수 6개 앞의 주소)

*(&aiData+ 1) ====> *(&aiData + 1)을 역참조하면 두 번째 메모리 블록의 첫 번째 항목 주소가 됩니다.

*(&aiData+ 1) – aiData ====> *(&aiData + 1)은 정수 6개 앞의 주소를 가리키므로 둘 사이의 차이는 6입니다.
 

예제 프로그램 2:

매크로를 사용하여 자체 sizeof 연산자를 만들어 배열의 총 항목 수를 계산 합니다.

#include <stdio.h>
// User created size of operator
#define SIZEOF(Var) ((char*)(&Var + 1) -(char*)&Var)
int main(int argc, char *argv[])
{
    int iTotalElement = 0 ;
    int  aiData[] = {10, 20, 30, 40, 50, 60};
    iTotalElement = SIZEOF(aiData)/SIZEOF(aiData[0]);
    printf("Number of element = %d",iTotalElement);
    return 0;
}
 

 

결과:

 

728x90