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

C 检查和比较不同类型变量的内存地址,c,memory,nodes,lvalue,C,Memory,Nodes,Lvalue,我试图比较内存中两个变量的地址: chunk_t *old_chunk, *new_chunk; if(&(old_chunk + 1 + old_chunk->size) == &new_chunk) { } 以下是chunk\u t的原型: typedef struct chunk_tag { struct chunk_tag *next; /* next node in list */ int size; /* size of node i

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

chunk_t *old_chunk, *new_chunk;

    if(&(old_chunk + 1 + old_chunk->size) == &new_chunk) { }
以下是chunk\u 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\u chunk->size和一个chunk\u-old\u chunk,所以我在if语句中键入case-old\u chunk->size作为chunk\t,编译器告诉我“转换为非标量类型请求”

以下表达式

old_chunk + 1 + old_chunk->size
不是左值,因此不能使用
&
运算符获取其地址。这是编译器在第一条错误消息中告诉您的

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

(chunk_t) old_chunk->size

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

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

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

根据代码的外观,您希望在不使用
&
的情况下执行地址检查:

if(old_chunk + 1 + old_chunk->size == new_chunk) { }
这是因为两个变量都是指向
chunk\t
对象的指针

确保你知道你在做什么。将
1
添加到
old\u chunk
意味着在内存中查找
sizeof(chunk\t)
字节比
old\u chunk
指向的位置晚。相反,添加
old\u chunk->size
意味着以后查看
sizeof(chunk\t)*old\u chunk->size
字节。

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


另外,这不是一个“原型”。这是结构的定义。

一件事是你对新块的声明。它被声明为chunk\t,而旧chunk被声明为*chunk\t,一个指向chunk\t的指针

如果您将代码重新编写为

    chunk_t * old_chunk, *new_chunk;

if((old_chunk + 1 + old_chunk->size) == new_chunk) { 
    printf("some message");
}

那就行了。或者至少编译。

您的新块应该这样声明吗?new_chunk还是*new_chunk?我的错,它在代码中被声明为指针,但我重写它时有一个拼写错误。谢谢你想比较
chunk\u t
对象的指针地址还是
chunk\u t
对象本身的地址?这是一个巨大的差异。地址本身。这些应该是链表中的节点,我想检查旧的\u块是否直接出现在内存中新的\u块的后面,这样我就可以合并它们了。所以我应该试着把地址保存为一个变量,并与之进行比较?好的,这很有意义。虽然两个变量都有指针,但为什么不是==new\u chunk而不是==&new\u chunk呢?因为您错误地声明了变量,后来更正了您的问题:-),这很好。我想知道添加旧块->大小是否意味着只添加整数*大小字节。这就是我想要的,添加sizeof(chunk\u t)*大小字节。太好了,谢谢你!好吧,这是有道理的。我有一个关于整数加法的问题,如果old_chunk是一个chunk\t var,old_chunk->size是一个整数,那么添加整数不只是增加integersize中的字节数而不是chunk\t size中的字节数吗?