链表堆空间分配问题

#include <stdio.h>
#include <malloc.h>
typedef struct Node {
        int value;        //4
        struct Node* next;        //4
}Node;

Node *create();
void add();
void del();
void search();

Node *create(int v) {
    Node *first;
    first = (Node *)(calloc(1,sizeof(*first)));
    first->value = v;
    first->next = NULL;
    return first;
}
void add(Node **head,int v) {
    Node *p;
    p = (Node *)(calloc(1,sizeof(*p)));
    p->value = v;
    p->next = *head;
    *head = p;
    
}
void search(Node *head) {
    Node *p;
    p=head;
    while(p != NULL) {
        printf("address is %d;value address is %d;next address is %d;next content is %d\n",p,&(p->value),&(p->next),p->next);
        p = p->next;
    }
}



int main() {
    Node *head;
    head = create(0);
    add(&head,1);
    add(&head,2);
    add(&head,3);
    search(head);
    

}

图片描述

一个Node的大小是int的4字节加上Node指针的4字节,共8个字节。为什么分配的时候,上面的链表块大小为16个字节。

阅读 4.3k
3 个回答

请使用sizeof(int)确定int的字节数

32位系统指针4字节,64位系统指针8字节
并且默认的话,64位系统结构体会对齐到8字节,所以是16
还有,你用地址差求结构大小的做法不可取,谁说堆上分配给你的空间一定要连续了

动态分配的内存不一定是连续的。要连续的自己申请数组,这么小的内存用数组更好。
Node all[NR_NODES];
动态分配浪费内存,又容易出错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进