🖥️ 컴퓨터 싸이언스

C | array-to-pointer conversion of function parameter type adjustment (배열과 포인터)

노바깅 2023. 6. 17. 19:18

 조교 업무를 하다가 처음 알게 된 사실이 있다! C언어에서 일반적으로 배열과 포인터는 동일하다고 설명하고, 나도 지금까지 그냥 배열과 포인터가 동일하다고만 생각하고 있었다. 하지만 배열은 배열이고 포인터는 포인터라는 것..!

 

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

void fff(int array[]);

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

    printf("%d %d\n", sizeof(data), sizeof(data[0]));

    fff(data);

    printf("\n\n");

    return 0;
}


void fff(int array[]) {
    int temp;
    int num = sizeof(array) / sizeof(array[0]);

    printf("%d %d\n", sizeof(array), sizeof(array[0]));

    return;
}

 그런데 위의 코드에 대한 예상 출력과 실제 출력이 달라서 신기했다.

// 예상 출력
20 4
20 4

// 실제 출력
20 4
8 4

 

 그래서 왜 그런거지? 하고 궁금해서 검색을 해보니 sizeof operator 에서 힌트를 찾을 수 있었다.

 

 array-to-pointer conversion으로 인해 array가 pointer로 바뀌었고, 이로 인해 [code]fff[/code] 안에서 sizeof 연산을 하면 배열의 크기인 20이 아니라 포인터 변수의 크기인 8 (64bit) 이 나오는 것이었다.

 그럼 언제 배열이 포인터로 바뀌는 것일까? 라는 질문도 들었는데 이 블로그에서 너무 친절하게 설명해주셨다. 간단하게 정리하자면, 배열은 특정한 경우를 제외하고는 "pointer to type" type을 가진 표현식으로 변환된다. 그 특정한 경우는 1) sizeof의 피연산자, 2) &연산자의 피연산자, 3) 배열을 초기화하는데 사용되는 문자열 리터럴 이다. 따라서 함수의 매개변수로 전달될 때는 배열이 더 이상 배열이 아니라 포인터로 전달되는 것이다!