为什么在C中使用malloc时指定大小?

And*_*ech 21 c malloc memory-management

请使用以下代码:

int *p = malloc(2 * sizeof *p);

p[0] = 10;  //Using the two spaces I
p[1] = 20;  //allocated with malloc before.

p[2] = 30;  //Using another space that I didn't allocate for. 

printf("%d", *(p+1)); //Correctly prints 20
printf("%d", *(p+2)); //Also, correctly prints 30
                      //although I didn't allocate space for it
Run Code Online (Sandbox Code Playgroud)

malloc(2 * sizeof *p)我用这条线为两个整数分配空间,对吧?但是如果我添加int到第三个位置,我仍然可以正确分配并可检索.

所以我的问题是,为什么在使用时指定尺寸malloc

Sin*_*nür 126

简单的逻辑:如果你没有停在一个合法的停车位,没有任何事情可能发生,但偶尔你的车可能被拖走,你可能会陷入巨额罚款.而且,有时候,当你试图找到你的汽车被拖走的地方时,你可能会被一辆卡车撞倒.

malloc为您提供尽可能多的合法停车位.您可以尝试在其他地方停车,它似乎可以工作,但有时它不会.

对于这样的问题,C FAQMemory Allocation部分是一个有用的参考咨询.见7.3b.

在一个相关的(幽默)注意,也见列表比较忌讳艺术.

  • + 1我喜欢这个比喻 (32认同)
  • 这个比喻很好,但你不解释发生了什么.对于理解这个问题的人来说,这似乎是显而易见的......但如果他理解这个问题,他就不会问这个问题.程序可能崩溃或者他正在使用的内存可能被覆盖的事实并不明显.解释这个比喻背后的情况,这是一个简单的+1. (4认同)
  • 完美的比喻.你可以日复一日地非法停车,也许什么都不会发生.但仍有可能被拖走或出票,所以你不应该这样做. (3认同)

Iga*_*ban 31

C请让你自己开枪.你刚刚在堆上使用了随机内存.带来不可预见的后果.

免责声明:我的最后一次真正的C编程是在大约15年前完成的.

  • 不需要免责声明,这个答案绝对正确.通常你分配的下一个变量是被覆盖的变量,但是如果你真的不走运,你可能会碰到另一个程序的变量空间并随意搞乱. (2认同)

ang*_*son 27

让我给你一个类比,说明为什么这个"有效".

假设您需要绘制一幅图纸,这样您就可以取出一张纸,将其平放在桌子上,然后开始绘图.

不幸的是,这篇论文还不够大,但你不是在关心,也不是在注意,只是继续绘制你的绘画.

完成后,你退后一步,看看你的绘图,它看起来很好,完全按照你的意思,完全按你的绘制方式.

直到有人出现并拿起他们在你到达之前留在桌子上的那张纸.

现在有一块画不见了.你在那个人的纸上画的那篇文章.

此外,那个人现在在他的纸上有你的画作,可能会弄乱他想要在纸上的任何东西.

因此,虽然您的内存使用似乎可行,但它只会这样做,因为您的程序已完成.在运行一段时间的程序中留下这样的错误,我可以保证你会得到奇怪的结果,崩溃和诸如此类的东西.

C就像类固醇上的电锯一样.几乎没有什么是你做不到的.这也意味着你需要知道自己在做什么,否则在你知道它之前,你会看到树直到你的脚.


Har*_*d L 13

你有(不)幸运.访问p [3]是未定义的,因为您没有为自己分配该内存.读取/写出数组的结尾是C程序以神秘的方式崩溃的方式之一.

例如,这可能会改变通过malloc分配的其他变量中的某些值.这意味着它可能会在以后崩溃,并且很难找到覆盖您数据的(无关的)代码.

更糟糕的是,您可能会覆盖其他一些数据,但可能不会注意到.想象一下这意外地覆盖了你欠某人的钱;-)

  • 它也可能覆盖有关堆中的内容的信息,这意味着malloc()和free()可能会做越来越多的事情,直到出现非常神秘的崩溃而没有明显的原因. (8认同)