포인터로 배열을 받아 size 구하기

lacovnk의 이미지

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으로 받은 시작주소를 넘겨주게 했는데.. 왜그렇지요? 으음 -_-;

아아 ㅠㅠ

ixevexi의 이미지

당신에게는 TCPL이 필요합니다 :D

sizeof(a)는 a형 변수의 크기입니다.
그럼 a가 포인터일때 sizeof(a)는 어케될까요?

네 ~ 포인터의 크기가 되겠죠?
무조건 -_- 4가 될겁니다.

c에서는 sizeof로 array의 크기를 알 수 없습니다.

C++, 그리고 C++....
죽어도 C++

lacovnk의 이미지

ixevexi wrote:
당신에게는 TCPL이 필요합니다 :D

sizeof(a)는 a형 변수의 크기입니다.
그럼 a가 포인터일때 sizeof(a)는 어케될까요?

네 ~ 포인터의 크기가 되겠죠?
무조건 -_- 4가 될겁니다.

c에서는 sizeof로 array의 크기를 알 수 없습니다.

int a[10] 을 하고,
sizeof(a)를 하면 10이라고 나오는걸요? -_-;

으음. 배열명으로 주어질때는 가능하고, 포인터로 줄때는 불가능한건가..

설명해주신 것이라고 추측은 하고 있었지만.. 으음.

아아, 귀찮아라 -_-;

맹고이의 이미지

함수 인자로 배열이 넘어가면...
결국 포인터로 넘어가는 걸로 알고 있습니다.

ixevexi의 이미지

이런 제가 말을 잘못했습니다.

C에서 배열의 크기는 sizeof()로 알 수 있습니다.

그런데 위의 array에선 알 수 없죠 ^^
포인터니까요~

C++, 그리고 C++....
죽어도 C++

sodomau의 이미지

음.. 일단 저런식으로 넘어가면 죽어도 알 수 없죠;

대부분의 경우,

array를 다룰 일이 있으면

array의 시작 포인터와 array의 사이즈를

함수의 argument로 만들지 않나요.

Testors의 이미지

lacovnk wrote:

int a[10] 을 하고,
sizeof(a)를 하면 10이라고 나오는걸요? -_-;

40 이겠죠? ^^

lacovnk의 이미지

Testors wrote:
lacovnk wrote:

int a[10] 을 하고,
sizeof(a)를 하면 10이라고 나오는걸요? -_-;

40 이겠죠? ^^

예;;;;; :oops:

세벌의 이미지

ixevexi wrote:
당신에게는 TCPL이 필요합니다 :D

TCPL 이게 무슨 뜻인지요?
Rica의 이미지

죠커의 이미지

the C Programming Language겠죠 :-)

vajna의 이미지

sizeof()의 리턴값은 전처리 상수이기 때문에 포인터 정의는 그크기를 포인터 사이즈, 최대값이 코드에서 직접 결정되어 있는 배열은 배열사이즈로 리턴합니다.

머나먼 땅으로 우리 동무가 이제 떠나간다네.
고향의 바람이 불어와 동무 뒤를 따르고
사랑스러운 도시가 푸른 이내 속에서 사라지네.
정든 집, 푸른 동산, 부드러운 눈길도...

ssehoony의 이미지

위에서 말씀하신 것 처럼 배열을 선언한거면 sizeof 하면 배열 사이즈를 알 수 있지만, 포인터이면 포인터 사이즈인 4바이트가 반환되져
그래서 혹자는
int a[100] 과 int* b 에서 a 와 b 는 엄현히 다른 것이다 라고 말하기도 하더군요.
b 의 경우는 사이즈를 알 수 없지만 a 의 경우 byte 가 아닌 배열의 길이를 알고 싶을 때는 sizeof(a)/sizeof(a[0]) 과 같은 Tip 이 있죠.
저런 배열의 몇가지 불편함 때문에 c++ 의 vector 같은데 참 변리하다는 걸 느끼져.

lkjt의 이미지

저게 가능하다면

라이브러리 등등에서

왜 배열의 사이즈를 넘길까요?

체스맨의 이미지

vajna wrote:
sizeof()의 리턴값은 전처리 상수이기 때문에

주제와는 관련이 없는 내용이긴 하지만, sizeof 는 상수는 맞지만,
전처리 상수는 아닙니다. 전처리 상수로 처리해주는 컴파일러는 제가
써본 것 중엔 볼랜드사 제품밖에 없었습니다. 예를 들어 전처리 상수라면

#if sizeof(long)==8
# define __64__
#endif

처럼 쓸 수 있어야 하는데, 볼랜드 컴파일러를 제외하면 위와 같은 문장은
대개 허용되지 않습니다.

Orion Project : http://orionids.org

lunarainbow의 이미지

sodomau wrote:
음.. 일단 저런식으로 넘어가면 죽어도 알 수 없죠;

대부분의 경우,

array를 다룰 일이 있으면

array의 시작 포인터와 array의 사이즈를

함수의 argument로 만들지 않나요.

sizeof 함수로는 알 수 없지만, 죽어도 알 수 없다고 하긴 좀 뭐하지 않나요?

굳이 알려고 든다면 알 수 있을텐데..

예전에 어디선가 본 기억이 납니다.

lkjt의 이미지

포인터로 가면 절대 불가 입니다!,,,

문자열 같은경우에는

NULL이란 문자가 있어서

그부분에서 끈기 때문에 문제 가 없죠

그러나 일반 배열같은경우에는 끊을수가 없습니다,,,

정 하고 싶다면

자신만의 기호를 넣어도 되죠,

2,4,1,2,5,2,2,3,5,1,-30

-30 이 끝을 가르키는 식으로,

그럼

while 문으로 돌리면 되겟죠?

이방법 밖에는 없죠,

포인터가 아니라면

sizeof(배열)/sizeof(배열형)

이렇게 하면됩니다만,,,

아시죠? ;)

ssehoony의 이미지

배열로 선언한 것의 사이즈를 알 수 있는 것은
컴파일 타임때 그 배열의 사이즈를 알 수 있기 때문입니다.
하지만 포인터는 컴파일 타임때 그 포인터가 가르키는 주소에 있는 데이터가 얼마큼 큰 사이즈인지 알 수 없기 때문에 sizeof 로 배열 사이즈를 알아내는 것은 불가능 하죠.

ljkt 님께서 말씀하신 것 처럼

Quote:
자신만의 기호를 넣어도 되죠,

2,4,1,2,5,2,2,3,5,1,-30

-30 이 끝을 가르키는 식으로,

그럼

while 문으로 돌리면 되겟죠?

배열의 마지막에 특별한 마크( '여인' 이라고 하더군여, 한자로 뭔지 모르겠네요 ^^;; )를 해서 처리하는게 포인터와 사이즈를 같이 넘기지 않고 포인터만 넘겨도 된는 장점도 있고 또한 그 방법을 사용하면 좀 더 빠른 포퍼먼스를 낼 수도 있습니다.

무슨 말인고 하니

void test(int* buf, int size)
{
      int i;
      for(i=0; i < size; ++i, ++buf)
      {
            ....... (*buf) ..............
      }
}

이렇게 이용하는 것 보다 아래 코드가 눈꼽 만큼 빠르다는 거져. ^^
(여인이 'NULL' 이라고 가정하면)

void test(int* buf, int size)
{
      if(buf == NULL) return;

      do
      {
            ....... (*buf) ..............
      }
      while((++buf) != NULL)
}
ㅡ,.ㅡ;;의 이미지

devilhero wrote:

그래서 혹자는
int a[100] 과 int* b 에서 a 와 b 는 엄현히 다른 것이다 라고 말하기도 하더군요.
.

ㅡ.ㅡ?? 누가저걸 같은거라고 말하는사람이 있나요?ㅡ,.ㅡ;
devilhero wrote:

b 의 경우는 사이즈를 알 수 없지만 a 의 경우 byte 가 아닌 배열의 길이를 알고 싶을 때는 sizeof(a)/sizeof(a[0]) 과 같은 Tip 이 있죠.
저런 배열의 몇가지 불편함 때문에 c++ 의 vector 같은데 참 변리하다는 걸 느끼져.

c++이아니라 C에도 있는디요..
그리고 불필요한곳에 많은정보를 넘기면 그만큼 비효율적이되니 필요한것에만 넘기는게 더낮죠..


----------------------------------------------------------------------------

ixevexi의 이미지

Quote:

devilhero 씀:

b 의 경우는 사이즈를 알 수 없지만 a 의 경우 byte 가 아닌 배열의 길이를 알고 싶을 때는 sizeof(a)/sizeof(a[0]) 과 같은 Tip 이 있죠.
저런 배열의 몇가지 불편함 때문에 c++ 의 vector 같은데 참 변리하다는 걸 느끼져.

c++이아니라 C에도 있는디요..
그리고 불필요한곳에 많은정보를 넘기면 그만큼 비효율적이되니 필요한것에만 넘기는게 더낮죠..

devilhero님의 말씀은 c++은 기본으로 벡터가 있다는 뜻일겁니다.
c의 표준안(c99)에 vector라는 자료구조가 있다는 말은 아직 못들어 봤습니다.
반해 C++은 바로 쓸 수 있죠 /해당 헤더를 넣어주기만 하면/

C++, 그리고 C++....
죽어도 C++

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.