본문 바로가기
개발/실수 노트

인자로 배열을 넘긴 경우, 배열의 크기를 구할 수 없게 됨!!

by 개발자 구리 2022. 3. 13.

Background

https://guris-devlog.tistory.com/entry/bit-shift%EB%A5%BC-%EC%8B%A4%EC%88%98%ED%95%98%EB%8B%A4

 

bit flag / left shift 사용 중 defect을 맞았다

Background 길이 5인 배열 arr가 있다. 해당 배열에는 enum으로 정의되어있는 action 정보가 들어가있는데, 예를 들면 arr = {actionC, actionZ, actionP, actionX, actionA} 이런식이다. 내가 구현하고자 하는 함..

guris-devlog.tistory.com

(위의 포스팅을 작성하며 코드를 짜던 중 시간을 살짝 날렸던 문제에 대한 정리)

 

아래와같이 arr를 출력하는 코드를 작성해보았다.

결과는 '1 2 3 4 5'가 나오길 바랐지만..

#include <stdio.h>

void printArr(int arr[]) {
    int len = sizeof(arr) / sizeof(int);
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
}

int main() {
    int arr[5] = { 1, 2, 3, 4, 5 };

    printArr(arr);
}

Output

1 2

 

놀랍게도, 아무리 arr를 늘렸다가 줄였다가 하며 sizeof(arr)를 찍어봐도 8이 나오는 것을 볼 수 있었다.

그 이유는 바로 printArr의 함수에서 인자로 arr를 넘길 때, 배열 arr[]이 아닌 배열 이름 arr로 넘기기 때문이다.

배열의 이름을 넘긴다는 것은 배열의 0번째 인자를 가리키는 주소값을 넘긴다는 것과 마찬가지로 해석할 수 있다.

 

따라서 printArr 내부에서는 sizeof(arr)이 배열의 크기가 아닌 포인터 그 자체의 크기가 된다.

그리고 포인터가 가리키는 배열은 정적 배열과 달리 그 크기를 동적으로 할당받을 수 있기 때문에 컴파일시 그 크기를 미리 알 수 없고

문자열과 같이 null 문자로 배열의 마지막을 지시하지 않는 이상 배열의 크기는 알 수 없다.

 

어찌보면 기본적인 내용인데 생각을 못했어서 황당 당황

배열의 길이를 알고싶다면 인자로 넘기는수밖에!

 

Solution

#include <stdio.h>

void printArr(int arr[], int len) {
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
}

int main() {
    int arr[5] = { 1, 2, 3, 4, 5 };
    int len = sizeof(arr) / sizeof(int);

    printArr(arr, len);
}

Output

1 2 3 4 5

'개발 > 실수 노트' 카테고리의 다른 글

bit flag / left shift 사용 중 defect을 맞았다  (0) 2022.03.11