如何将此结构放入此动态分配的空间?

时间:2014-11-06 02:26:44

标签: c pointers struct dynamic-memory-allocation

我正在开发一个在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.我做错了什么?

2 个答案:

答案 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的优先级高于添加。