回复 19楼 bccnyouke
去搞了个小实验 想验证下malloc分配的BLOCK结构
发现个有趣的现象

程序代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
struct LNode *next;
int num;
float fl;
double du;
}LNode, *LinkList;
LNode* ApplyMem(LNode *head)
{
LNode *p;
int i, j;
i = sizeof(LinkList);
j = sizeof(LNode);
printf("%d %d\n", i, j); //输出的是i, j
if (NULL == head)
{
head = (LNode *)malloc(1 * sizeof(LinkList));
if (!head)
{
printf("Apply fail!\n");
return NULL;
}
}
head->next = NULL;
head->num = 1;
//head->ch = 'a';
head->fl = 1.2;
head->du = 22.0;
p = (LNode *)malloc(1 * sizeof(LinkList));
if (!p)
{
printf("Apply fail!\n");
return NULL;
}
p->num = 2;
//p->ch = 'b';
p->fl = 2.4;
p->du = 54.0435;
p->next = head->next;
head->next = p;
return head;
}
void FreeMem(LNode *head)
{
LNode *p;
while (NULL != head)
{
p = head;
head = head->next;
free(p);
}
}
void PrintList(LinkList head)
{
LinkList p;
p = head;
while (NULL != p)
{
printf("%d %f %f", p->num, p->fl, p->du);
p = p->next;
}
}
int main(void)
{
LNode *head = NULL;
head = ApplyMem(head);
PrintList(head);
//free(head);
head = NULL;
return 0;
}
实验时先不释放。
我上面这个程序运行也错误 如果改成(LNode *)malloc(2 * sizeof(LinkList));就能打印
但是2 * sizeof(LinkList) = 8也远小于LNode的实际大小(24)所以当添加上free后报错。
为什么会这样
后来查了下资料 原来malloc(STRUCT_SIZE)分配的内存实际要比STRUCT_SIZE要大
即在用户申请的空间前malloc隐式的分配了若干个字节用来写入被分配内存的信息 free函数就是
通过这个东西来释放内存的
如果用户申请的内存比结构体的size小了 在给结构体赋值时填充的内容会占用‘分配内存的信息’的
那块空间 即BLOCK结构被破坏 free必然出错。如果还没超出整个分配内存,打印没问题,如果超出了
那么打印也无法进行。
这个算是我的理解 具体的细节还不甚了了 不知道理解的对不对?