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

标签 c memory nodes lvalue

我正在尝试比较内存中两个变量的地址:

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,编译器告诉我“请求转换为非标量类型” ”

最佳答案

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

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

从您的代码来看,您希望在不使用 & 的情况下进行地址检查:

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/

相关文章:

c - 我收到错误 undefined symbol : __const_udelay?

c++ - 如何在Windows中获取文件的扩展名

node.js - console.log 上的 NodeJS 简单水平线

java - 将字符串转换为 LinkedList 并通过递归浏览它

c# - Xpath 节点选择 - 如何选择 2 个不同的元素?

c - 搜索函数返回错误的计数

c - 使用msg_accrights在进程之间发送&fd是一个bug吗?

linux - 检查是否可以从linux内核空间访问内存地址

c# - 删除 Windows Phone 页面

java - 对 Permgen 空间这种行为的解释