zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    mouseOver与rollOver
    排序二叉树
    发展
    bitmapData
    回调与事件
    遍历舞台上所有对象
    面向对象原则
    面向对象的三大特征(个人理解)
    面向对象出现原因以及意义
    OC语言BLOCK和协议
  • 原文地址:https://www.cnblogs.com/wintergrass/p/2229670.html
Copyright © 2011-2022 走看看