我正在尝试比较内存中两个变量的地址:
chunk_t *old_chunk, *new_chunk;
if(&(old_chunk + 1 + old_chunk->size) == &new_chunk) { }
这是 chunk_t 的原型(prototype):
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,编译器告诉我“请求转换为非标量类型” ”
最佳答案
您不能获取计算值的地址。获取地址仅适用于已在堆栈上某处分配的值。
想象一下“将 1
和 2
加在一起得到的值的地址是什么?”没有地址,因为它是一个计算值。您需要有一个变量或一个计算的内存位置,以便能够直接操作内存。
从您的代码来看,您希望在不使用 &
的情况下进行地址检查:
if(old_chunk + 1 + old_chunk->size == new_chunk) { }
这是因为您的两个变量都是指向 chunk_t
对象的指针。
只要确保您知道自己在做什么即可。将 1
添加到 old_chunk
意味着在内存中比 old_chunk
指向的位置晚查找 sizeof(chunk_t)
字节。相反,添加 old_chunk->size
意味着稍后查找 sizeof(chunk_t) * old_chunk->size
字节。
关于检查并比较不同类型变量的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9558558/