함수에서 외부의 포인터상수를 참조하는 법(숫자 배열의 길이 구하기)
C언어를 공부하면서 몇일전 부터 생각해 오던 숫자 배열의 길이를 구하는 법은 알았습니다.
배열이름과 배열 요소의 sizeof 연산을 나누어서 숫자 배열의 길이를 구할수 있더군요..
제게 한줄기 광명과도 같은 빛이 내리쬐는 것 같았습니다.
그래서 전 이제 배열을 매개변수로 받는 함수를 작성해서
매개변수로 받은 배열(숫자배열)의 길이를 리턴하는 함수를 만들고 싶었습니다.
매번 sizeof 를 쓰기가 귀찮아서 였죠..
하지만 이런 ! 리턴된 값은 기대하던 값이 아니었죠.
이유는 배열이 매개변수로 전달되면 첫번째 번지값이 포인터로 전달되기 때문이었죠
그래서 제가 만든 함수에서 받은 배열값은 그저 포인터 형이었으므로 예상하던 배열길이가 아닌
포인터 형의 값만 덜렁 나와서 -1 이라던지 1이라는 값이 리턴되고 있었습니다.
그래서 어떻게 하면 메인함수에서 하듯 서브함수에서도 배열의 길이를 sizeof 연산으로 알아낼수
있을까요?
소스:
메인함수에서는 저런 형식으로 숫자 배열의 길이를 구할수 있었습니다.
int data[]={1,2,3};
int data_size=0;
data_size=sizeof(data)/sizeof(data[0]);
그래서 항상 배열 길이를 알기위해 sizeof 연산하기가 귀찮으니 함수를 만들려고 했죠
바로 이 함수
int get_length(int array[]){
int length=(sizeof(array))/(sizeof(array[0]));
return length;
}
하지만 리턴된 값은 기대한 값이 아닙니다.. 매개변수가 배열 전체가 넘어오는게 아니고 맨앞 번지만
포인터로 넘어오니까요
그래서 서브 함수에서 외부의 배열을 통째로 참조할수 없을까요?
원하시는 방법이 아닐 수도 있지만..
그냥 sizeof(data)/sizeof(data[0]); 도 꽤 간단해 보이는데 꼭 함수로 하셔야 하나요?
원하시는 방법은 아닐수도 있지만 아래처럼
매크로 함수를 사용하실 수도 있을것 같네요..
감사 합니당 그런데 생각해 보니,
매크로는 그저 치환만 할 뿐이니, 매번 다른 변수에 쓸수는 없을 듯 한데요 ~?
헐 이런 큰 맹점이 !
it takes a day to make you yawn, brother
포인터 배열의 길이를 알기 쉬웠다면
fread 함수에 자료형과 크기를 받아들이는 인자는 없었을 겁니다.
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
배열 전체를 넘기려면
구조체를 하나 만들어서 배열을 그 구조체의 원소로 선언해서 쓰세요.
함수에 넘길때는 그 구조체 자체를 인자로 넘기세요. 그러면 당연히 배열 전체가 넘어가지요.
제가 알기로 C 언어 자체에서 배열을 복사(?)하는 문법은 이것밖에 없는 듯.
음 그렇군요..
감사 합니다. 매우 복잡해 지는 군요 ~
it takes a day to make you yawn, brother
아니죠
배열을 복사하는 건 없어도, 배열의 시작주소를 보낼 수는 있습니다.
그러면 배열에 대한 모든 조작이 가능해지지요.
앗 잘못 올린 댓글 ~ 죄송
지웠습니당
it takes a day to make you yawn, brother
아 그렇군요 여러가지 방법이 그중에서도 매크로가 가장 편할듯 !
그렇군요 구조체를 이용하는 방법도 있겠고요, 매크로로 함수를 정의해도 되겠군요
아하하.. 저는 그냥 sizeof 계속 써야 하는게 귀찮아서 그랬던 거니 매크로로 정의해서 쓰면 되겠네요 ~
정말 감사 합니다 ~모두들
좋은 하루 되세요
it takes a day to make you yawn, brother
전혀 쌩뚱맞지만...
전혀 쌩뚱맞지만... C++을 쓰세요! 각종 컨테이너가 jokerol님을 반겨줄 것입니다. :)
ㅋ _ ㅋ 감사 합니다 지금 공부중 ~
it takes a day to make you yawn, brother
it takes a day to make you yawn, brother
댓글 달기