0

メモリ内の 2 つの変数のアドレスを比較しようとしています。

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 文で old_chunk->size を chunk_t として型変換すると、コンパイラから「非スカラー型への変換が要求されました」と言われました。

4

4 に答える 4

1

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

1「とを足した結果の値のアドレスは2?」ということを想像してみてください。計算値であるため、そのアドレスはありません。メモリを直接操作できるようにするには、変数または計算されたメモリ位置が必要です。

あなたのコードがどのように見えるかから、あなたはあなたの住所チェックをなしで行いたいと思っています&:

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

これは、両方の変数がオブジェクトへのポインターであるためです。chunk_t

自分が何をしているのかを確認してください。に追加1するということは、メモリ内で where が指しているより後のバイトold_chunkを探すことを意味します。逆に、追加はバイトを後で調べることを意味します。sizeof(chunk_t)old_chunkold_chunk->sizesizeof(chunk_t) * old_chunk->size

于 2012-03-04T20:40:52.133 に答える
0

次の式

old_chunk + 1 + old_chunk->size

&は左辺値ではないため、演算子でそのアドレスを取得することはできません。これは、コンパイラが最初のエラー メッセージで伝えた内容です。

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

(chunk_t) old_chunk->size

sizeがプリミティブ型の場合は無効です。

于 2012-03-04T20:38:49.913 に答える
0

必要ありません&(old_chunk + 1 + old_chunk->size)。単純old_chunk + 1 + old_chunk->sizeに。さらに、構造体のold_chunk->size >= 0ように宣言したかどうかを確認することをお勧めintします。

PS「プロトタイプ」ではありません。構造体の定義です。

于 2012-03-04T20:42:58.367 に答える
0

1 つのことは、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");
}

それはうまくいくでしょう。または、少なくともコンパイルします。

于 2012-03-04T20:47:05.450 に答える