检查并比较不同类型变量的内存地址

时间:2012-03-04 20:34:46

标签: c memory nodes lvalue

我试图比较内存中两个变量的地址:

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语句中出现了编译错误“lvalue required as anary'&'操作数”。

我以为是因为我添加了一个int old_chunk->大小和一个chunk_t old_chunk,所以我在if语句中将old_chunk-> size指定为chunk_t,编译器告诉我“转换为非标量”请求“

4 个答案:

答案 0 :(得分:1)

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

想象一下,“将12加在一起会产生什么价值的地址?”没有地址,因为它是一个计算值。您需要有一个变量或一个计算的内存位置,以便能够直接操作内存。

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

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

这是因为你的变量都是指针chunk_t个对象。

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

答案 1 :(得分:0)

以下表达式

old_chunk + 1 + old_chunk->size

不是左值,因此您无法使用&运算符获取其地址。这是编译器用第一条错误消息告诉你的。

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

(chunk_t) old_chunk->size

如果size是基本类型,则无效。

答案 2 :(得分:0)

您不需要&(old_chunk + 1 + old_chunk->size)。 只需old_chunk + 1 + old_chunk->size。 此外,最好检查old_chunk->size >= 0是否因为您在结构中将其声明为int

P.S。这不是'原型'。它是结构的定义。

答案 3 :(得分: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");
}

然后它会起作用。或者至少编译。