我试图比较内存中两个变量的地址:
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,编译器告诉我“转换为非标量”请求“
答案 0 :(得分:1)
您无法获取计算值的地址。获取地址仅适用于已在堆栈中某处分配的值。
想象一下,“将1
和2
加在一起会产生什么价值的地址?”没有地址,因为它是一个计算值。您需要有一个变量或一个计算的内存位置,以便能够直接操作内存。
从您的代码看起来,您希望在没有&
的情况下进行地址检查:
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");
}
然后它会起作用。或者至少编译。