茱莉亚•埃文斯

39天:写作malloc错了,为了好玩

我今天的主要成就是写以下五行ofcode:

让:~与= ~(与“a”);头:putc(*);让b:~与= ~(b与);头:putc(*);头:putc b(*);;

,他们可能会做错事。人们通常会认为这toprint”艺术展”。但对我来说,现在,直到我停止滥竽充数,itprints”ABB”。这是为什么呢?吗?

好吧,这是因为我malloc实现是这样的:

静态狗基地:使用uint = 0 x200000;酒吧外面的”C”fn malloc(len:使用uint)- > *狗与{不安全{让ret:使用uint =基地;返回基地*狗与;}}

这意味着每次分配内存,我得到同样的pointerback,所以一个b无论如何永远是平等的。And forthat matter any variable I create will always have the same value.This is of course a terrible idea in real life,但它是reallyfun

这是我的真实malloc函数(导致上面的代码打印”艺术展”,就像它应该):

酒吧外面的”C”fn malloc(len:使用uint)- > *狗与{不安全{让ret:使用uint =基地;基地+ = len + size_of::
          
           ();/ /下分配4字节边界对齐。如果(基地% 4 !+ = = 0){基地4 -(基地% 4);} *(基地*狗使用uint)=兰;返回(ret + size_of::
           
            ())*狗与;} }酒吧外面的”C”fn免费(ptr:*狗与){ / /咩。}
           
          

最难的部分不是写malloc。写作malloc是很容易的,只要你永远不需要释放内存。我alsojust写C实现通过复制它。你只需要保持一个计数器并递增。

困难的部分是正确的类型的函数,因为生锈:)。这是完全由能够弥补傻memorygames玩。