我在一本书中读到,C中的malloc函数需要您希望分配的内存"块"的数量作为参数,并根据您将malloc返回的值转换为多少字节来确定块。例如,在我的系统中,int值为4字节:
int *pointer;
pointer = (int *)malloc(10);
将分配40个字节,因为编译器知道int是4个字节。
这让我很困惑,有两个原因:
我正在阅读,size参数实际上是你想要分配的字节数,与任何类型的大小无关。
Malloc是一个返回地址的函数。它如何根据从void返回到不同类型的地址的外部强制转换来调整分配的内存大小?这只是我应该接受的一些编译器魔法吗?
书中是这样说的:
char *string;
string = (char *)malloc(80);
80设置了80块存储空间。块大小由类型转换(char *)设置,这意味着malloc()正在为80个字符的文本寻找存储空间。
是的,这本书是错的,你是对的,请把那本书扔掉。
另外,一定要让每个人都知道这本书的名字,这样我们就可以把它永久地列入我们的不推荐黑名单。
好读:
malloc的最佳实践是什么?
当使用malloc()
时,使用sizeof操作符并将其应用于被分配的对象,而不是其类型。
不是个好主意:
int *pointer = malloc (10 * sizeof (int)); /* Wrong way */
更好的方法:
int *pointer = malloc (10 * sizeof *pointer);
原理:如果你改变了指针指向的数据类型,你不需要同时改变malloc()调用。维护赢。
同样,这种方法在代码开发过程中更不容易出错。在malloc()调用发生在变量声明之外的情况下,您可以检查它是否正确,而不必查看声明。
关于转换malloc()的问题,请注意,今天在C语言中,不需要对malloc()进行转换。此外,如果数据类型在将来的修订中发生变化,那么任何类型的转换也必须更改,否则将成为另一个错误源。另外,一定要确保包含<stdlib.h>
。通常,人们使用cast是为了消除由于没有包含文件而导致的警告。另一个原因是c++中需要使用malloc(),但您通常不会编写使用malloc()的c++代码。
关于malloc()如何在内部工作的确切细节在规范中没有定义,实际上它是一个具有良好定义接口的黑盒。要了解它在实现中是如何工作的,您需要查看一个开源实现的示例。但是malloc()可以(并且确实)在不同的平台上变化很大。