2010-11-19 16 views
0

構造体のアドレスを指定したアドレスに設定しようとしていますが、構造体のアドレスを出力するときは、与えられた。ラインでリンクされたリスト内の構造体へのポインティング

/*a struct to keep block information*/ 
struct header{ 
    int space; 
    int free; /* 1 = free space and 0 = full*/ 
    struct header *nextHead; 
    struct header *prevHead; 
}; 

typedef struct header node; 

int myinit(int *array, int size){ 

    int newSize = size; 
    node * nullPointer; 
    nullPointer = NULL; //make intermediatry node pointer for some bullshit reason 

    * (array) = newSize; /*store the size of the malloc at the first address*/ 

    printf("Address : %p\n", &array[0]); 
    array++; 
    printf("Address after: %p\n", &array[0]); 

    /*initial block*/ 
    node *root = (node *)&array; /*store the root at the next address available*/ 
    printf("size of struct %lu\n", sizeof(struct header)); 

    printf("%p\n", root); 

    root->space = newSize; 
    root->free = 1; 
    root->nextHead = nullPointer; 
    root->prevHead = nullPointer; 


} 
+0

コードは、最初は正常に見えます一見、問題はどこですか? – DarkDust

答えて

2

node *root = (node *)&array; 

あなたは "アレイ" のローカル変数のアドレスを取っています。 IOW、あなたはあなたが期待しているものではなく、スタック上にある価値のあるアドレスを取る。関数のシグネチャを次のように変更する必要があります。

int mymain(int **myarray, int size); 

それに応じて、その定義を変更する必要があります。次に、あなたが書くことができます。

また
node *root = (node *)array; 
+1

良い答えですが、関数定義は 'int **'の代わりに 'node **'を使うべきであると付け加えたいと思います。また、なぜ誰かがリンクされたリストノードを最初に配列に格納するのか、なぜ 'newSize'が2つの異なる場所に格納されているのか、私は考えていません。おそらくインターフェイス要件はここでは正しく理解されていないでしょう。私のコードで –

0

、代わりに&array[0]を使用しての、コードのこの部分でarrayを使用しています。
シンプルなコードを書いて、書くすべての行を理解すれば、ポインタと混乱することは少なくなります。 1行にアンパサンドと特殊記号がたくさんあるときは、間違ったことをしているかもしれませんが、そのような状況のためにあなたのクモの巣を訓練してください。

1
node *root = (node *)&array; 

ここでは、ポインタのアドレスを取得して他のポインタにキャストします。あなたはこれをしてはいけません。ここでは、ノードのためにメモリを割り当てる必要があります。

node * root = (node *) malloc(sizeof(node)); 
// or this allocates the memory and puts zeros to it  
node * root = (node *) calloc(1, sizeof(node)); 

また、あなたは、単にこのようにNULLを使用することができ、NULLを指すの任意のノードを必要としません:

node->nextHeader = NULL; 
+0

私はmallocを書き換えているので、mallocへの暗黙の呼び出しを使用することはできません。構造体を作成し、その中の値を設定できる別の方法がありますか?値を直接NULLに設定することで、コンパイルできなかったため、中間値を作成してそれを設定する必要がありました。 – Alex

+0

コンパイルエラーは何ですか?メモリを割り当てる別の方法で答えを更新しました –

関連する問題