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 语句中将 old_chunk->size 类型化为一个 chunk_t,编译器告诉我“请求转换为非标量类型”

4

4 回答 4

1

您不能获取计算值的地址。获取地址仅适用于已在堆栈中某处分配的值。

1想象一下,“相加得到的值的地址是什么2?” 没有地址,因为它是一个计算值。您需要有一个变量或计算的内存位置,以便能够直接操作内存。

从您的代码的样子来看,您希望在没有以下代码的情况下进行地址检查&

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

那是因为您的两个变量都是指向对象chunk_t的指针。

只要确保你知道你在做什么。添加1old_chunk意味着在内存中查找sizeof(chunk_t)字节,而不是old_chunk指向的位置。相反,添加old_chunk->size意味着稍后查找sizeof(chunk_t) * old_chunk->size字节。

于 2012-03-04T20:40:52.133 回答
0

下面的表达式

old_chunk + 1 + old_chunk->size

不是左值,因此您不能将其地址与&运算符一起使用。这是编译器在第一条错误消息中告诉您的内容。

第二条错误消息告诉您您尝试了无效的类型转换。看来你做了这样的事情:

(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

一件事是您对 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 回答