我这里有一个非常奇怪的问题:
typedef struct s_mem_chunk
{
void *addr;
unsigned int size;
short is_alloc;
struct s_mem_chunk *prev;
} t_mem_chunk;
#include <stdio.h>
#include <stdlib.h>
int main()
{
t_mem_chunk *mem_chunk;
mem_chunk = malloc(sizeof(*mem_chunk));
mem_chunk->prev = 0;
printf("%x + %x = %x\n", mem_chunk->prev, sizeof(*mem_chunk), mem_chunk->prev + sizeof(*mem_chunk));
return 0;
}
所以这里的代码应输出: “0 + 18 = 18” 它输出“0 + 18 = 240”
所以我想知道为什么,这可能是由于我不知道的大小... 我请求你的帮助,提前感谢你的时间,祝你有个美好的夜晚! :d
答案 0 :(得分:4)
你误解了0 + 18 = 240,这是正确的结果!
0是mem_chunk->prev
的值。
18是你结构的大小;请注意这是六进制。
你有指针算术,所以mem_chunk->prev + sizeof(*mem_chunk)
像往常一样不是0 + 18,而是从0开始的数组的第19个假设元素的地址。所以0x18 * 0x18 = 0x6中的0x240。在指针运算中,向指针添加数字可计算移动; int
用作指针的距离,距离的单位是指针指向的对象的类型。如果您向int
指针添加1,则在之后计算内存地址一int
...
在你的情况下:
mem_chunk->prev+1
不是1
,0x18
而mem_chunk->prev+2
不是2
,而是0x30
。
另请注意格式并使用%p
作为指针,使用%lx
(C99中为%zx
)sizeof返回long int
。
答案 1 :(得分:2)
您的程序调用未定义的行为。
x
转换说明符需要类型为unsigned int
的参数,但mem_chunk->prev
是指针值。 mem_chunk->prev + sizeof(*mem_chunk)
相同,它不执行整数运算,但指针运算并产生无效指针。