2013-04-06 25 views
0

我正在读一本书,在C malloc函数需要“块”的内存要分配作为参数的数量,决定了你投什么的块被多少字节基础malloc返回的值。例如我的系统上的int是4个字节:因为编译器知道int为4个字节çmalloc函数的大小参数

int *pointer; 

pointer = (int *)malloc(10); 

将拨出40个字节。

这让我困惑的原因有两个:

  1. 我读了,大小参数实际上是要分配,并没有涉及到任何类型的大小的字节数。

  2. 的malloc是返回地址的功能。它如何根据从void返回的地址的外部转换调整其分配的内存的大小,以不同的类型?这只是我应该接受的一些编译器魔法吗?

我觉得这本书是错的。任何帮助或澄清非常感谢!

下面是书上说的:

char *string; 
string = (char *)malloc(80); 

80套预留80块存储。块大小是由类型转换,(字符*),这意味着设置的malloc()被用于80个字符的查找存储器。

+0

你正在阅读哪本书,对于内存分配的工作方式有点古怪的看法? – 2013-04-06 04:22:59

+0

C多功能一体化桌面参考傻瓜...我喜欢傻瓜系列:) – 2013-04-06 04:26:46

+4

如果它出错了,很难预测还有什么不对。有时间来识别这本书(所以我们可以将它列入黑名单),然后去做一个更好的书。 _ [...时间passeth ...] _显然,这是一个'For Dummies'的书;在这种情况下,也写成'傻瓜'。将它强行扔出窗外或倒入垃圾,并获得更好的东西。 '块大小'是'一个字节'或'sizeof(char)';演员阵容不会影响通话的行为。 – 2013-04-06 04:26:55

回答

8

是这本书是错的,你是正确的,请扔掉那本书。
另外,不要让大家知道这本书的名字,所以我们可以永久地把它放在我们从未建议黑名单。

良好阅读:
What is the Best Practice for malloc?

+0

也可能他误解了这本书在说什么。 – 2013-04-06 04:18:19

+0

添加http://lysator.liu.se/c及其引用的所有内容。 – vonbrand 2013-04-08 00:18:23

6

当使用malloc(),使用sizeof操作符,并把它应用到该对象被分配,它不是那种

不是一个好主意:

int *pointer = malloc (10 * sizeof (int)); /* Wrong way */ 

更好的方法:

int *pointer = malloc (10 * sizeof *pointer); 

理由:如果你改变指针指向,你不需要更改malloc的数据类型()打电话。维护胜利。

此外,此方法是在代码开发中不易出错。您可以检查它是正确的,而不必看看那里的的malloc()调用变量声明出现在分开的情况下声明。

关于你有关铸造malloc()的问题,请注意,对于在C中的malloc()进行强制转换,现在有不需要。另外,如果数据类型应该在未来的版本改变,任何投也就不得不随之改变或者是另一个误差源。此外,请务必确保您已包含<stdlib.h>。通常人们通过投入来摆脱由于没有包含文件而导致的警告。另一个原因是它在C++中是必需的,但通常不会编写使用malloc()的C++代码。

有关malloc()如何在内部工作的具体细节未在spec中定义,实际上它是一个带有明确界面的黑盒子。要了解它在实现中的工作原理,您需要查看示例的开源实现。但是malloc()可以(并且确实)在各种平台上变化很大。