2016-06-23 3 views
3

にコードの行を理解する上で、私は、これはコードの一部である運動に取り組んでいます:トラブルC

typedef struct node 
{ 
    size_t size; 
    struct node *next; 
} node_t; 

byte heap[SIZE]; 

node_t *node_list; 

void heap_init() 
{ 
    node_list = (node_t*) heap; 
    node_list->size = SIZE; 
    node_list->next = NULL; 
} 

しかし、私はラインに立っ下にいくつかの問題があります。

node_list = (node_t*) heap; 
+1

Offtopic:peace - > piece。 –

+0

これは、 'heap'が' node_t'に対して正しく整列されない可能性があるため、未定義の動作です。また、それは厳密なエイリアシング規則に違反します –

答えて

3

heapは、サイズがSIZEのバイト配列です。

node_listは、node_tのポインタです。このポインタは配列heapの最初のバイトに割り当てられます。これは、割り当てられたメモリ位置にnode_listが割り当てられていることを意味します。

リストの次のポインタがこの配列に沿った場所に割り当てられると思います。

これはおそらくグローバル変数のヒープをシミュレートしており、mallocの使用を避けているため、一部の組み込みシステムでは使用できません。

1

コードには、node_tインスタンスを格納するのに、heapに割り当てられたメモリが使用されています。malloc機能の学校の1つを使用して割り当てます。

byte*へのポインタとコードに分解し、独自の変数heapは、「私はnode_t*ポインタとしてbyte*を再解釈したい」と言います。このために値SIZEを動作させること

注そうnode_tインスタンスがheap変数に収まらない、少なくともsizeof(node_t)でなければなりません。

1

に思えるあなたが代わりにmallocやのcallocの一般的な方法の

バイト配列 ..としてメモリつまりを割り当てるあまり一般的方法を使用しているために指しているコード

node_list =(node_t *)heap;ヒープバイト配列はここで ため

一つは、この行から推測することができるすべてであり、ポインタ構造体ノードへタイプである

考えます。node_list開始を指していますバイト配列ヒープとなるので、ポインタはバイト*タイプstructノード*型に型キャストされています。

struct node * ptr =(struct node *)malloc(sizeof(struct node));

ここで(struct node *)はmalloc(sizeof(struct node))の前で使用されます。タイプキャストvoid mallocから返されたポインタの型は、必要なものと一致するように構造ノードの '='等号の左側にあります。

希望します。