h突然吧 关注:189贴子:40,321
  • 14回复贴,共1

写个malloc玩玩?

只看楼主收藏回复

void *hTuRan = malloc(sizeof(IDOL));


来自Android客户端1楼2017-11-13 04:09回复
    回来了咱……
    要写这个帖子首先咱们得搞明白一些基本知识!
    内存条嘛……长这个样:

    (图片转自CSC258)
    来翻译一下,从上往下分别是保留区(Reserved)、代码区(Text)、全局变量区(Globals)、堆(Heap)跟栈(Stack)。
    内存这种东西其实就是一条很长很长很长…的字符(char)数组,跟图上长得一模一样。
    malloc要做的事情就是在堆里面取一段【子数组】,再把那个【子数组】开始的位置以指针的形式返回出来。嗯,就这么简单哟。


    2楼2017-11-13 09:42
    收起回复
      2026-01-15 07:37:24
      广告
      不感兴趣
      开通SVIP免广告
      基础知识继续——
      虽然咱们可以把内存当成一条很长的数组,但是实际上……
      ……
      ……为了节省【真实的内存】,这条很长的数组其实很短——有多短呢?
      无极也不知道呐。
      但是这条数组可以用sbrk函数变长!
      按照上面那张图来讲,在执行一个程序(yingziay.exe)的时候,系统给这个程序分配……总之少到仅能够把yingziay.exe的所有二进制码跟全局变量都装起来那么多的内存吧。
      关于这点,楼上的图中其实有一点不是很对——Globals开始的位置并非恒定0x10000000... Globals开始的位置跟Text结束的位置是一样的啦其实。
      定义:【数据区(data segment)】指的是Text, Globals跟Heap这三个区域合起来的内存。在一个程序还没开始执行的时候,数据区的大小等于Text的大小加上Globals的大小,因为Heap的大小为0。
      定义:【程序断点(program break)】指的是数据区结束的位置。是个指针噢。
      那么,来,这里给大家介绍一个叫sbrk的系统函数:
      void *sbrk(int increment);
      这个函数能使程序断点往后推——或者说,若把数据区当成一条数组的话,这个函数能使数据区这条数组变长。
      increment参数是数据区将要增长的数量。
      如果increment为0则不增加数据区的长度。
      如果increment是负数的话则减少数据区的长度……哦对,咱们是不会给sbrk传负数的,原因接下来会说。
      至于返回值——如果函数增长成功了的话这个函数会返回原来的程序断点,否则的话返回NULL并会把errorno(程序运行时的错误代码)设成ENOMEM(内存不足)。
      malloc要做的嘛……malloc会在程序运行的时候调用sbrk这个函数。
      但是有一点要注意了!
      ——如果咱们给sbrk传正数参数的话,这个函数会在【某些时候】运行得……特·别·慢。
      一时半会无极也说不清楚为什么……原因很多,但是都是些难解释的东西……
      malloc要做的就是尽量减少调用sbrk的次数。
      ================== 分割线 ==================
      若想知道上面说的【某些时候】指的是哪些时候的话……可以百度一下【内存分页】。


      3楼2017-11-13 10:29
      收起回复
        基础知识最后一条——灵活数组类型

        这个结构体的data成员是一个长度为0的数组。
        它的大小跟下面的结构体大小相等:

        ……嗯?那我们要data成员干嘛,它里面不是什么都没有吗……
        没错,它里面什么都没有;但是它是这个结构体中的最后一个成员,咱们可以用数组越界的方式访问紧挨着这个结构体后面的内存!
        假设有一结构体struct vector v.
        v的大小为16, 它开始的位置是0x00——由于0x00到0x0F都是这个结构占用的空间,那么如果我们想把0x10这个字节上的数据修改为 'W' 的话,直接
        v.data[0] = 'W';
        就好了噢!
        嗯,毕竟0x10是紧挨着紧挨着这个结构体后面的第一个字节嘛。
        ——是不是有种开了外挂的感觉!


        4楼2017-11-13 10:43
        回复
          今天就到这里吧。


          5楼2017-11-13 10:46
          回复
            @jiangdist


            6楼2017-11-13 10:56
            回复
              大。。大佬


              IP属地:湖南来自Android客户端7楼2017-11-13 11:33
              回复
                楼主回来了——
                这周先把顶层代码写好,之后的细节之后有空了再说啦~
                (话说我差点把整个repo给毁了... 还好git有个叫做fsck的功能,吓死咱了2333333)


                8楼2017-11-19 05:37
                收起回复
                  2026-01-15 07:31:24
                  广告
                  不感兴趣
                  开通SVIP免广告
                  代码在这!
                  啊,还有好多没写的呢……
                  讲真啊,时间都花在写realloc上了╮(╯▽╰)╭……最不常用的一个malloc竟然写了最久。


                  9楼2017-11-19 05:41
                  回复
                    噢对了,咱用的是worst fit策略... 一般人都不用这个的吧23333...
                    但是没办法呀,这个策略的诱惑力太强了,玄学上来说无论空间还是时间都是。


                    10楼2017-11-19 05:44
                    回复