C内存分配问题(内存达人请进)【转】

#include <stdio.h>

void main()
{
int a = 0;
int b = 0;
int *c = &a;
int *m = new(int);
int *n = new(int);
int *k = new(int);
int *l = new(int);

printf("在栈中分配存储空间\n");
printf("%d\n%d\n%d\n%d\n",&a,&b,c,&c);

printf("在堆中分配存储空间\n");
printf("%d\n%d\n%d\n%d\n",m,n,k,l);
}

运行结果为:
在栈中分配存储空间
1244996
1244992
1244996
1244988
在堆中分配存储空间
4398112
4398064
4398016
4397968
Press any key to continue

为什么 在 堆中每次分配的存储空间都不一样, 而且地址间距固定为48字节,而不是4字节????

A1:

关于堆内存分配问题:
系统把堆可用的堆内存用链表把他们一串一串的连起来,要分配的时候,就遍历该链表,直到遇到足够分配空间的串时就把该串内存按需要的分配出来(int *m = new(int)时,分配4个BYTE),剩下的(48-4 = 44个BYTE)把它再放回链表的尾。所以,LZ你申请的四次,申请到的内存都是4个BYTE,而不是简单的减去得到的那48BYTE。但是每次申请后,剩下的42BYTE就会被放到链表的尾,所以,下次申请到的内存,开始地址都不能直接减去之前的那串得到,而是在链表的下一个节点(下一个48BYTE中)申请!

A2:

The c programming language 第八章有讲解

转自:http://topic.csdn.net/u/20110510/20/79ede448-a63d-40bc-8ae7-40a6d232ac08.html

原文地址:https://www.cnblogs.com/wintergrass/p/2229670.html