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中的字节数吗?