#include<stdio.h>
int ccc(int *arr);
int main()
{
int arr[5] = { 1,2,3,4,5 };
int r = sizeof(arr) / sizeof(arr[0]);
printf("\nmain arr sizeof=%d\n ", r);
ccc(arr);
return 0;
}
int ccc(int *arr)
{
int r=0;
r=sizeof(*arr) / sizeof(arr[0]);
printf("\nvoid arr sizeof = %d ", r);
return r;
}
왜 main()과 int()는 방식이 다른건가요? 포인터라 그런건가요? 그럼 어떻게 하는게 좋죠
16개의 댓글
무분별한 사용은 차단될 수 있습니다.
잉텔
C언어에서 배열 크기를 구하는 방법은 공식적으로는 없습니다
클로로프렌
그럼 어떻게 해요? c++은 있음?
잉텔
std::array 같은걸 제공은 하는데.. 글쎄...
번한강행
함수에 인자로 넘어갈 땐 포인터로써 넘어감
그래서 크기가 4(또는 8)이 나옴
그래서 함수에 사이즈도 같이 넘겨줘야함
클로로프렌
아... 방법없음? 그래서 책에서 사이즈 넘겼구나... 포인터 배열 크기 구하는 방식은 없을까요?
숨은음은
int arr[5] 할때, arr은 이미 이 자체가 포인터임.
main에서 보면 sizeof(arr) / sizeof(arr[0]);으로 해놨던데
여기는 왜 이렇게 쓰고
ccc함수에는 왜 갑자기 sizeof(*arr) / sizeof(arr[0]);함
이렇게 하면, sizeof(arr[0]) / sizeof(arr[0]); 한 거랑 똑같은 거임..
그럼 결과가 1이 나오지..
그러므로
int ccc(int* arr)
{
return sizeof(arr) / sizeof(int);
}
하면 크기를 알려줄 거임
근데 이경우 위에서도 말했다시피 단순 포인터로만 넘어와서(배열포인터가 아닌)
사이즈가 그냥 int*의 사이즈만 알려주고 말거임
그래서 어떤 크기인지도 넘겨줘야함.
그런데 그러면 의미가 없지?
클로로프렌
안되요 ㅠㅠ *arr 이 arr[0]이라고 배워서 안했음
그 *(arr+1)이 a[1]로 나오잖아요 아 안되는 거인 듯
숨은음은
밑에 달아놨잖아..
저렇게 하면 단순 포인터라서
포인터 크기만 알려주고 말거라고 ㅠㅠ
그래서 사이즈를 넘겨줘야 하는데
그러면 굳이 사이즈를 왜구해 사이즈를 줬는데...
뱀고기
https://ideone.com/vaOiP1
이런식으로 배열크기를 달고 다녀야됨
클로로프렌
그냥 #define SIZE 이렇게 들고 다니는게 더 좋을까요? 이게 편하긴 편한데 ㄷㄷ
뱀고기
한 프로그램에서 배열 여러개 쓰면 못함
클로로프렌
for문으로 사이즈 하나 하나 누적 덧셈(sum)해서 구하는건 좀 그런가요?
반복문 쓰면 될 거 같은데 나중에 복잡해지면 느려질까봐 걱정 ....
뱀고기
포인터만 가지고 메모리영역 끝이 어딘지를 앎?
클로로프렌
아 그러네 이런
하테나
메인함수에서는 배열 자체에 크기를 지정해줬고 이건 상수이기 때문에 컴파일타임에서 sizeof 연산의 결과를 계산해서 하드코딩으로 때려박기 때문에 결과가 제대로 나오는 것 처럼 보이는거고
매게변수에다가 암만 대괄호 넣고 배열이라고 선언해봤자 그건 프로그래머 보기 편하라고 만들어놓은 syntactic sugar일 뿐 컴퓨터가 봤을땐 똑같은 포인터이기 때문에 올바른 배열사이즈 계산은 불가능하다.
Patrick
손쉽게 배열 사이즈 구할수 있는 파스칼 하쉴?