我正在开发一个在C中实现伙伴分配算法的项目。使用mmap(),我分配了1GB连续内存的空间。它看起来像这样:
char * base = mmap(NULL, MAX_MEM, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, 0, 0);
我有一个结构,我试图放入该空间。结构看起来像这样:
typedef struct Node {
unsigned char header;
struct Node *next;
struct Node *prev;
}node;
我不确定如何让节点进入该位置。我尝试了下面的代码,因为我不想把节点放在最开头,但是当我打印出指针时,它们显示了很多不同的点
void *ptr = (struct Node *) base + 512;
printf("base: %p\n", base);
printf("ptr: %p\n", ptr);
我的终端窗口打印出来:
base: 0x102ef1000
ptr: 0x102ef4000
但是这看起来并不正确,因为指针在内存中相距12288个空格而不是512.我做错了什么?
答案 0 :(得分:1)
请注意,当您将基础转换为添加struct Node *
的基础时,现在会向指针添加struct Node
的大小,因此您要向其添加sizeof(struct Node) * 512
。这可能不是你想要的。鉴于它是一个24字节的结构,这使它成为24 * 512 = 12288
。
它是12个字节的原因是它包含2个8字节指针,1个字节的字符和7个字节的填充,以确保指针对齐到8个字节。
要解决此问题,只需省略强制转换,它会将base作为char *
并将其增加为512字节。
void *ptr = base + 512;
答案 1 :(得分:1)
void *ptr = (struct Node *) base + 512;
表示((struct Node *)base)+ 512.
你想要的是
void *ptr = (struct Node *) (base + 512);
所以你从分配开始就跳过了512个字节。
根据the post,cast的优先级高于添加。