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 FAQ的Memory Allocation部分是一个有用的参考咨询.见7.3b.
Iga*_*ban 31
C请让你自己开枪.你刚刚在堆上使用了随机内存.带来不可预见的后果.
免责声明:我的最后一次真正的C编程是在大约15年前完成的.
ang*_*son 27
让我给你一个类比,说明为什么这个"有效".
假设您需要绘制一幅图纸,这样您就可以取出一张纸,将其平放在桌子上,然后开始绘图.
不幸的是,这篇论文还不够大,但你不是在关心,也不是在注意,只是继续绘制你的绘画.
完成后,你退后一步,看看你的绘图,它看起来很好,完全按照你的意思,完全按你的绘制方式.
直到有人出现并拿起他们在你到达之前留在桌子上的那张纸.
现在有一块画不见了.你在那个人的纸上画的那篇文章.
此外,那个人现在在他的纸上有你的画作,可能会弄乱他想要在纸上的任何东西.
因此,虽然您的内存使用似乎可行,但它只会这样做,因为您的程序已完成.在运行一段时间的程序中留下这样的错误,我可以保证你会得到奇怪的结果,崩溃和诸如此类的东西.
C就像类固醇上的电锯一样.几乎没有什么是你做不到的.这也意味着你需要知道自己在做什么,否则在你知道它之前,你会看到树直到你的脚.
Har*_*d L 13
你有(不)幸运.访问p [3]是未定义的,因为您没有为自己分配该内存.读取/写出数组的结尾是C程序以神秘的方式崩溃的方式之一.
例如,这可能会改变通过malloc分配的其他变量中的某些值.这意味着它可能会在以后崩溃,并且很难找到覆盖您数据的(无关的)代码.
更糟糕的是,您可能会覆盖其他一些数据,但可能不会注意到.想象一下这意外地覆盖了你欠某人的钱;-)