배열의 element(요소) 개수 구하기
글쓴이: freestyle / 작성시간: 목, 2009/07/23 - 10:33오전
배열의 element 개수를 구하는 가장 잘 알려진 방법은,
#include <stdio.h> int main(void) { int arr[] = { 1, 2, 3, 4, 5 }; printf("count : %d\n", sizeof(arr) / sizeof(arr[0])); // or // printf("count : %d\n", sizeof(arr) / sizeof(*arr)); return 0; }
일 것입니다(보통 매크로로 제작).
또한 생각해 본 바로는
#include <stdio.h> int main(void) { int arr[] = { 1, 2, 3, 4, 5 }; int *a, *b, *x, *y; a = (int *)(&arr + 1); b = (int *)&arr; x = arr + 1; y = arr; printf("count : %d\n", (a-b)/(x-y)); return 0; }
처럼 나타낼 수 있을 것입니다.
이외에, 다른 방법은 없을까요?
곰곰히 생각해 보고 있는데 더 이상 떠오르지 않네요.
그리고 배열 요소 개수 구하는 함수를 별도로 구현해 함수에 배열을 전달하면
포인터로만 받을 수 있기에
첫 번째의 경우 'sizeof(포인터 변수)'가 되어 원하는 결과를 얻지 못하고,
두 번째 역시 하나의 포인터만 받아서는 참조되는 배열 전체의 크기를 알지 못하게 됩니다.
그래서 제가 생각한 방법은
#include <stdio.h> int get_arr_cnt(int *p, int *q); int main(void) { int arr[] = { 1, 2, 3, 4, 5 }; printf("count : %d\n", get_arr_cnt(arr, (int *)(&arr+1))); return 0; } int get_arr_cnt(int *p, int *q) { return (q - p)/((int *)(p+1) - p); }
입니다.
count를 직접 전달하지 않고 알아낼 수 있는 방법이 또 뭐가 있을까요?
Forums:
두번째 방법은
두번째 방법은 이상하게 보이는데 잘못된것이 아닌가요?
항상 1이 출력이 될꺼 같은데요
단지 표현만 조금 다를뿐이지 의미상으로는 완전히 같은
a와 x, b와 y인거 같은데요
결국 같은값을 나누니까 결과는 1인거 같은데
인용:두번째 방법은
cinsk님이 번역하신 CFAQS의 Q 6.12를 보시면
즉, &arr의 대상체는 배열 전체이며,
+ 연산자의 역할에 의해 '포인터 + 정수 상수'는
해당 포인터가 참조하는 대상체의 크기(sizeof의 결과와 동일) * 정수 상수가 원래의 포인터 값에 더해진 결과가 되므로
&arr+1은 배열의 끝을 가리키는 포인터 상수가 됩니다.
(int*)로 casting한 건 int ** 인데, int *에 구겨넣어 포인터 간의 뺄셈을 하기 위한 것입니다.
----------------------
Go to the U-City
----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------
댓글 달기