프로그래밍C 개발자

C 언어에서 포인터와 배열의 차이는 무엇인가요? 배열을 함수에 전달하는 올바른 방법은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

C 언어에서 포인터와 배열은 관련이 있지만 동일하지는 않습니다:

  • 배열 — 메모리에 있는 동일한 유형의 요소 집합, 크기로 정의됩니다.
  • 포인터 — 배열 또는 개별 객체를 가리킬 수 있는 메모리 주소를 저장하는 변수입니다.

함수에 배열을 전달할 때 실제로는 배열의 첫 번째 요소에 대한 포인터가 전달됩니다 (따라서 함수 내의 sizeof는 전체 배열의 크기를 주지 않고, 오직 포인터의 크기만 제공합니다).

전달 구문:

void foo(int arr[], int size) { // arr — 실제로는 int* for (int i = 0; i < size; ++i) printf("%d\n", arr[i]); } int main() { int data[5] = {1,2,3,4,5}; foo(data, 5); }

함정 질문.

질문: 함수 내에서 sizeof(arr) 표현식이 무엇을 반환하나요? arr은 int arr[] 유형의 매개변수입니다.

답변: 포인터의 크기(sizeof(int*))를 반환하며, 전체 배열의 크기는 반환하지 않습니다. 함수에 첫 번째 요소에 대한 포인터가 전달되기 때문에 길이에 대한 정보가 잃어버리게 됩니다.

코드 예시:

void printSize(int arr[]) { printf("%zu\n", sizeof(arr)); // sizeof(int*)는 보통 4 또는 8 }

역사

상업적 프로젝트에서 배열의 평균값을 계산하기 위해 작성된 코드에서 요소 수를 함수 내에서 sizeof(arr) / sizeof(arr[0])로 가져왔고, 이는 항상 1 또는 2를 반환하여 실제 요소 수를 잘못 알게 되었습니다. 이로 인해 프로그램이 데이터와 올바르게 작동하지 않았고, 값을 잘못 평균화했습니다.


역사

어떤 프로젝트에서 동적으로 할당된 배열이 길이(size)를 별도로 저장하지 않고 함수로 전달되었습니다. 그 결과 함수는 할당된 요소 수를 알지 못하게 되어 경계를 넘어가거나, 메모리 누수 또는 손상이 발생했습니다.


역사

잘못된 방법으로 고정 크기 배열이 포인터로 사용되었고, 일부 컴파일러에서는 memcpy를 통해 전체 배열을 요소가 아닌 직접 할당하는 것이 허용되어 부분적인 데이터 구조나 스택 오버플로우가 발생했습니다.