2016-05-04 32 views
1

は動的にここで私が使用している構造体の定義はだ、私は動的に割り当てられたメモリと、構造体の配列を作成しようとしています構造体のノードの配列

をメモリの割り当て宣言と初期化:Xは、私はここでそれを呼び出す前に定義された番号の他、動的に割り当てられた配列である

int base_nodes = sizeof(X)/sizeof(*X); 
while ((base_nodes - 1)%(D-1) != 0){ 
    printf("Incrementing base\n"); 
    base_nodes++; 
} 

printf("base_nodes:\t%d\n", base_nodes); 
struct node **nodes = malloc(base_nodes * sizeof(struct node)); 

if (nodes) { 
    printf("Size of nodes:\t%llu\n", sizeof(nodes)); 
} else { printf("Failed to allocate memory\n"); return 1;} 

。私は8未満base_nodesを試してみましたが、10を8の報告はなく、され、それはまた、これがなぜ起こるか誰か説明してもらえ

8を返します。
私の知る限りでは、base_nodesしかし、ノードのサイズは、正しく計算されていますか?そしてそれをどうやって正しく行うか?

私が作成しているプログラムは、PMFが与えられたD-aryハフマンコードジェネレータです。

私はまた、プログラムの後半でreallocをしようと、効果がなかったしているようだ:

nodes = realloc(nodes, ((sizeof(nodes) + 1) * sizeof(struct node))); 
if (nodes) { 
    printf("New size:\t%llu\n", sizeof(nodes)); 
} else { printf("Not enough memory\n"); } 
+0

まあ、割り当てられた要素の数を返すためにはsizeof()演算子を使用することができるという事実によって混乱していると思います'nodes'変数のサイズ(バイト単位)' sizeof() '関数はあなたのマシンのアドレスサイズを常に返します。あなたの場合は' 8'です。あなたが期待していたことを述べることができれば助けになります。 – jada12276

+1

ノードはポインタです。ポインタは、64ビットシステムで8バイト必要です。 –

+0

@ KunMingXieしかし、それはポインタの配列へのポインタです、私はそれが少なくとも8 * base_nodesになると予想していましたが、私はその動作を想像できると思いますが – Scy

答えて

0

あなたは演算子を使用して、動的に割り当てられたタイプstruct nodeの要素数を取得しようとしていますsizeof()はポインタ自体にあります。これはマシン上のポインタのサイズを返します。これは64ビットマシンと思われる8バイトです。 私はあなたがあなたが配列に静的にいくつかのメモリを割り当てるとき、あなたが読みしようとしていることから、すなわち

myType a[N]; 

number_of_elements = sizeof(a)/sizeof(myType) 
関連する問題