2016-05-13 5 views
3

を与えintへのポインタを設定する:は動的に私が定義され<code>struct</code>を持って間違ったサイズに

struct Query { 
    int *pages; 
    int currentpage; 
}; 


struct Query *new = malloc(sizeof(struct Query)); 

new->pages = malloc(sizeof(int) * 4); 

私は、サイズが行うことで4だったことを確実にするためにnew->pagesのサイズを確認:

int size = sizeof(new->pages)/sizeof(new->pages[0]); 

をしかし、 sizeは、4ではなく、2を返し続けます。

私が間違っているかもしれないことは誰にも分かりますか?

ありがとうございました。

+5

'はsizeof(新規作成>ページ)/はsizeof(新規作成>ページ[0])' '意味はsizeof(INT *)/はsizeof(INT)' ' – BLUEPIXY

+2

pages'が' pointer'あり、ありません配列です。あなたは言っている:ポインタのサイズを 'int'(ほとんどのシステムでは8/4 = 2)のサイズで割った値を教えてください。 – nicola

+2

要素数を格納する構造体に3番目のメンバ変数を追加することをお勧めします。 – user694733

答えて

8

あなたの期待は間違っています。

int size = sizeof(new->pages)/sizeof(new->pages[0]); 

sizeof(new->pages)

int要素の合計数を返しません。 intポインタのサイズ(int*)。 sizeof(int*)が8、sizeof(int)は、ご使用のプラットフォーム上で4であるので、それはsizeofオペレータがsize_t%zusize_tを印刷する(printf()中)書式指定子であるを返すように、あなたがsizeためsize_tを使うべきところで2

を返します。

+0

'sizeof(int *)'は私たちが知っているところからプラットフォーム上で4、 'sizeof(int)' 2にできないのですか? – nicola

+0

はい、これは可能ですが、最近のコンパイラではほとんど使用されません(旧式のTurbo Cコンパイラでない限り)。理論的には、それぞれ16と8であることも有効です。 –

2

sizeof演算子は、そのオペランドの型のサイズをバイトで返します。new->pagesの型は、構造体によって定義された整数へのポインタであるため、ポインタのサイズに評価されます。 、配列よりむしろ。

注例による差異:

int arr[4] = {0,1,2,3}; 
int *p = arr; 
printf("%zu\n", sizeof(arr)); // prints 16 
printf("%zu\n", sizeof(p)); // prints 4 

ONLYアレイでsizeof(arr)/sizeof(arr[0])作品を使用して配列の要素数を取得する慣習、それはポインタでは動作しません、あなたは上の長さを追跡維持する必要がありますあなた自身の。

0

ポインタは配列ではありません。ポインタが配列を指すことができるという事実にもかかわらず、sizeof()演算子をポインタに適用すると、指す配列のサイズではなくポインタのサイズが返されます。

したがって、サイズを把握するために、値の変数を使用して値(サイズ)を保存することをお勧めします。

ああ、あなたの変数のいずれかを指定しないでください。newあなたがC++コンパイラを使いたい場合に!

struct Query { 
    int *pages; 
    int currentpage; 
}; 

size_t size = 4; 

struct Query *p = malloc(sizeof(struct Query)); 

p->pages = malloc(sizeof(int) * size); 
関連する問題