结构的内存分配

let*_*tsc 1 c

有人可以解释我这个特殊的输出:

#include <stdio.h>

typedef struct node
{
  int i;
  struct node *next;
}node;

main()
{
    node *p,*q;
    printf(" %u ",sizeof(node));              // 16
    p = (node *)malloc(sizeof ( node ) ) ;     
    printf(" %p ",p);                    // 0x1cea010
    q = (node *)malloc(sizeof ( node ) ) ; 
    printf("\n %p ",q);                    // 0x1cea030
}
Run Code Online (Sandbox Code Playgroud)

我有一个64位处理器.当大小显示为16个字节时,为什么要为节点分配32个字节?我检查了一台32位机器.地址有8个字节的间隔.没有填充和东西.那么4字节的区别仅仅是因为64位机器的一些填充问题?

bta*_*bta 7

两次malloc调用不一定会返回连续的内存区域.进行此测试的更好方法是:

main()
{
    node *p;
    printf(" %u ",sizeof(node));
    p = (node*)malloc(2 * sizeof (node));     
    printf(" %p \n %p ", &p[0], &p[1]);
    free(p);
}
Run Code Online (Sandbox Code Playgroud)

通过分配数组,您可以确保它们在内存中背靠背.

根据您的实施情况malloc,您的系统可能正在使用其间的内存pq存储由reallocfree,和朋友使用的簿记信息.