2012-03-04 9 views
0

私はメモリ内に二つの変数のアドレスを比較しようとしています:ここで確認と異なる型の変数のためのメモリアドレスを比較する

chunk_t *old_chunk, *new_chunk; 

    if(&(old_chunk + 1 + old_chunk->size) == &new_chunk) { } 

はchunk_tのプロトタイプです:

typedef struct chunk_tag { 
    struct chunk_tag *next; /* next node in list */ 
    int size; /* size of node in units, not bytes */ 
} chunk_t; 

私はコンパイラを入手します私のif文のエラーは、単項「&オペランド」として必要な左辺値です。

int old_chunk-> sizeとchunk_t old_chunkを追加していたためだと思っていたので、if文でchunk_tとしてold_chunk-> sizeをtypecaseしてコンパイラから "non-scalar type次の式

old_chunk + 1 + old_chunk->size 

は左辺値ではないので、あなたが&オペレータと、そのアドレスを取ることができない」

+0

new_chunkを次のように宣言する必要がありますか? new_chunkまたは* new_chunk? –

+0

私のせいで、コード内にポインタが宣言されましたが、書き直したときにタイプミスがありました。ありがとう –

+0

'chunk_t'オブジェクトへのポインタのアドレス、または' chunk_t'オブジェクト自体のアドレスを比較しますか?大きな違いがあります。 – Irfy

答えて

1

計算された値のアドレスは取得できません。アドレスの取得は、スタックのどこかに既に割り当てられている値に対してのみ機能します。

12を一緒に追加した結果の値は何ですか?計算された値なので、アドレスはありません。メモリを直接操作できるようにするには、変数または計算されたメモリの場所が必要です。両方のあなたの変数がポインタchunk_tにオブジェクトであるためである

if(old_chunk + 1 + old_chunk->size == new_chunk) { } 

:あなたは&ずにチェックし、あなたの住所をしたい、のようなコードが見えるものから、

あなたが行っていることを知っていることを確認してください。 1old_chunkに追加すると、メモリ内のsizeof(chunk_t)バイト後に、old_chunkが指すよりも大きくなります。逆にold_chunk->sizeを追加すると、sizeof(chunk_t) * old_chunk->sizeバイト後になります。

+0

わかりました。両方のvarsはポインタを保持していますが、なぜ==&new_chunkではなく== new_chunkですか? –

+0

あなたはあなたの変数を間違って宣言し、後であなたの質問を修正しました:-) – Irfy

+0

それは素晴らしいです。私はold_chunk-> sizeを追加するだけでinteger * sizeバイトを追加することを意味するのだろうかと思っていました。それは、sizeof(chunk_t)* sizeバイトを追加するために必要なものです。それは素晴らしいです、ありがとう! –

0

を要求しました。これは、コンパイラが最初のエラーメッセージであなたに言ったことです。

2番目のエラーメッセージは、無効な型変換を試みたことを示しています。

(chunk_t) old_chunk->size 

sizeがプリミティブ型である場合には無効である:あなたがこのような何かをしたようです。

+0

hmm。だから私はそのアドレスを変数として保存し、そのアドレスと比較してみるべきですか? –

+0

@Joshいいえ、あなたは間違った方法を考えています。 – Irfy

0

&(old_chunk + 1 + old_chunk->size)は必要ありません。 単純にold_chunk + 1 + old_chunk->sizeです。 さらに、old_chunk->size >= 0が構造体にintと宣言されているかどうかを確認する方が良いでしょう。

P.S.それは「プロトタイプ」ではありません。それは構造の定義です。

+0

それは意味があります。私は整数の追加について質問があります。もしold_chunkがchunk_t varでold_chunk-> sizeが整数なら整数を追加しません。ちょうどchunk_tのバイト数ではなく整数*のサイズのバイト数を追加します*サイズ? –

0

あなたの宣言はnew_chunkです。これはchunk_tとして宣言され、old_chunkはchunk_tへのポインタである* chunk_tとして宣言されます。

あなたはあなたのコードが

chunk_t * old_chunk, *new_chunk; 

if((old_chunk + 1 + old_chunk->size) == new_chunk) { 
    printf("some message"); 
} 

として、書き込みし直す場合、それが動作します。または少なくともコンパイルしてください。

関連する問題