포인터로 배열을 받아 size 구하기
글쓴이: lacovnk / 작성시간: 수, 2004/04/28 - 9:39오후
struct BMTNode; typedef struct BMTNode* pBMTNode; typedef struct { pBMTNode *nodes; // array of *BMTNode -> **BMTNode int *keys; // array of key int size; }BMTNode; int printArray(int *array){ int i; int j = sizeof(array); printf("\nsize : %d\n",j); for(i=0;i<j;i++){ printf("array[%d] : %d\n",i,*(array+i)); } } BMTNode* createNode(int size){ BMTNode *result; result = (BMTNode*) malloc(sizeof(BMTNode)); result->keys = (int*) malloc(sizeof(int)*size); result->nodes = (pBMTNode*) malloc(sizeof(BMTNode)*size+1); result->size = 0; printf("size : %d / sizeof(keys) : %d / sizeof(int) : %d / sizeof(BMTNode) : %d",size,sizeof(result->keys),sizeof(int),sizeof(BMTNode)); printArray(result->keys); return result; }
size를 어떻게 주든 간에, printArray()에서 j=sizeof(array)는 4가 됩니다. :( malloc으로 받은 시작주소를 넘겨주게 했는데.. 왜그렇지요? 으음 -_-;
아아 ㅠㅠ
Forums:
당신에게는 TCPL이 필요합니다 :D sizeof(a)는 a형
당신에게는 TCPL이 필요합니다 :D
sizeof(a)는 a형 변수의 크기입니다.
그럼 a가 포인터일때 sizeof(a)는 어케될까요?
네 ~ 포인터의 크기가 되겠죠?
무조건 -_- 4가 될겁니다.
c에서는 sizeof로 array의 크기를 알 수 없습니다.
C++, 그리고 C++....
죽어도 C++
으음. 그런가요~
int a[10] 을 하고,
sizeof(a)를 하면 10이라고 나오는걸요? -_-;
으음. 배열명으로 주어질때는 가능하고, 포인터로 줄때는 불가능한건가..
설명해주신 것이라고 추측은 하고 있었지만.. 으음.
아아, 귀찮아라 -_-;
함수 인자로 배열이 넘어가면... 결국 포인터로 넘어가는 걸로 알고
함수 인자로 배열이 넘어가면...
결국 포인터로 넘어가는 걸로 알고 있습니다.
이런 제가 말을 잘못했습니다.C에서 배열의 크기는 sizeof()
이런 제가 말을 잘못했습니다.
C에서 배열의 크기는 sizeof()로 알 수 있습니다.
그런데 위의 array에선 알 수 없죠 ^^
포인터니까요~
C++, 그리고 C++....
죽어도 C++
음.. 일단 저런식으로 넘어가면 죽어도 알 수 없죠;대부분의 경우
음.. 일단 저런식으로 넘어가면 죽어도 알 수 없죠;
대부분의 경우,
array를 다룰 일이 있으면
array의 시작 포인터와 array의 사이즈를
함수의 argument로 만들지 않나요.
http://home.postech.ac.kr/~sodomau
Re: 으음. 그런가요~
40 이겠죠? ^^
Re: 으음. 그런가요~
예;;;;; :oops:
[quote="ixevexi"]당신에게는 TCPL이 필요합니다 :D [
TCPL 이게 무슨 뜻인지요?
세벌 https://sebuls.blogspot.kr/
The C Programming Languagehttp://bbs
The C Programming Language
http://bbs.kldp.org/viewtopic.php?t=36329&highlight=TCPL
:wink:
the C Programming Language겠죠 :-)
the C Programming Language겠죠 :-)
- 죠커's blog / HanIRC:#CN
sizeof
sizeof()의 리턴값은 전처리 상수이기 때문에 포인터 정의는 그크기를 포인터 사이즈, 최대값이 코드에서 직접 결정되어 있는 배열은 배열사이즈로 리턴합니다.
머나먼 땅으로 우리 동무가 이제 떠나간다네.
고향의 바람이 불어와 동무 뒤를 따르고
사랑스러운 도시가 푸른 이내 속에서 사라지네.
정든 집, 푸른 동산, 부드러운 눈길도...
위에서 말씀하신 것 처럼 배열을 선언한거면 sizeof 하면 배열 사이즈
위에서 말씀하신 것 처럼 배열을 선언한거면 sizeof 하면 배열 사이즈를 알 수 있지만, 포인터이면 포인터 사이즈인 4바이트가 반환되져
그래서 혹자는
int a[100] 과 int* b 에서 a 와 b 는 엄현히 다른 것이다 라고 말하기도 하더군요.
b 의 경우는 사이즈를 알 수 없지만 a 의 경우 byte 가 아닌 배열의 길이를 알고 싶을 때는 sizeof(a)/sizeof(a[0]) 과 같은 Tip 이 있죠.
저런 배열의 몇가지 불편함 때문에 c++ 의 vector 같은데 참 변리하다는 걸 느끼져.
저게 가능하다면라이브러리 등등에서왜 배열의 사이즈를 넘길까
저게 가능하다면
라이브러리 등등에서
왜 배열의 사이즈를 넘길까요?
Re: sizeof
주제와는 관련이 없는 내용이긴 하지만, sizeof 는 상수는 맞지만,
전처리 상수는 아닙니다. 전처리 상수로 처리해주는 컴파일러는 제가
써본 것 중엔 볼랜드사 제품밖에 없었습니다. 예를 들어 전처리 상수라면
처럼 쓸 수 있어야 하는데, 볼랜드 컴파일러를 제외하면 위와 같은 문장은
대개 허용되지 않습니다.
Orion Project : http://orionids.org
[quote="sodomau"]음.. 일단 저런식으로 넘어가면 죽어도 알
sizeof 함수로는 알 수 없지만, 죽어도 알 수 없다고 하긴 좀 뭐하지 않나요?
굳이 알려고 든다면 알 수 있을텐데..
예전에 어디선가 본 기억이 납니다.
포인터로 가면 절대 불가 입니다!,,,문자열 같은경우에는N
포인터로 가면 절대 불가 입니다!,,,
문자열 같은경우에는
NULL이란 문자가 있어서
그부분에서 끈기 때문에 문제 가 없죠
그러나 일반 배열같은경우에는 끊을수가 없습니다,,,
정 하고 싶다면
자신만의 기호를 넣어도 되죠,
2,4,1,2,5,2,2,3,5,1,-30
-30 이 끝을 가르키는 식으로,
그럼
while 문으로 돌리면 되겟죠?
이방법 밖에는 없죠,
포인터가 아니라면
sizeof(배열)/sizeof(배열형)
이렇게 하면됩니다만,,,
아시죠? ;)
배열로 선언한 것의 사이즈를 알 수 있는 것은컴파일 타임때 그 배열의
배열로 선언한 것의 사이즈를 알 수 있는 것은
컴파일 타임때 그 배열의 사이즈를 알 수 있기 때문입니다.
하지만 포인터는 컴파일 타임때 그 포인터가 가르키는 주소에 있는 데이터가 얼마큼 큰 사이즈인지 알 수 없기 때문에 sizeof 로 배열 사이즈를 알아내는 것은 불가능 하죠.
ljkt 님께서 말씀하신 것 처럼
배열의 마지막에 특별한 마크( '여인' 이라고 하더군여, 한자로 뭔지 모르겠네요 ^^;; )를 해서 처리하는게 포인터와 사이즈를 같이 넘기지 않고 포인터만 넘겨도 된는 장점도 있고 또한 그 방법을 사용하면 좀 더 빠른 포퍼먼스를 낼 수도 있습니다.
무슨 말인고 하니
이렇게 이용하는 것 보다 아래 코드가 눈꼽 만큼 빠르다는 거져. ^^
(여인이 'NULL' 이라고 가정하면)
[quote="devilhero"]그래서 혹자는 int a[100
ㅡ.ㅡ?? 누가저걸 같은거라고 말하는사람이 있나요?ㅡ,.ㅡ;
c++이아니라 C에도 있는디요..
그리고 불필요한곳에 많은정보를 넘기면 그만큼 비효율적이되니 필요한것에만 넘기는게 더낮죠..
----------------------------------------------------------------------------
[quote]devilhero 씀: b 의 경우는 사이즈를 알
devilhero님의 말씀은 c++은 기본으로 벡터가 있다는 뜻일겁니다.
c의 표준안(c99)에 vector라는 자료구조가 있다는 말은 아직 못들어 봤습니다.
반해 C++은 바로 쓸 수 있죠 /해당 헤더를 넣어주기만 하면/
C++, 그리고 C++....
죽어도 C++
댓글 달기