我正在读一本书中的C语言中的malloc函数获取您希望作为参数分配的内存的“块”数,并根据您将malloc返回的值转换为多少来确定块的数量。 。例如,在我的系统上,int是4个字节:
int *pointer;
pointer = (int *)malloc(10);
将分配40个字节,因为编译器知道整数是4个字节。
这让我感到困惑有两个原因:
我正在阅读,而size参数实际上是您要分配的字节数,与任何类型的大小无关。
Malloc是一个返回地址的函数。它如何根据从void返回到不同类型的地址的外部强制转换来调整它分配的内存大小?它只是我应该接受的一些编译器魔法吗?
我觉得这本书错了。非常感谢任何帮助或澄清!
这本书就是这样说的:
char *string;
string = (char *)malloc(80);
80个预留80个存储空间。块大小由类型转换(char *)设置,这意味着malloc()正在查找80个字符的文本存储。
答案 0 :(得分:8)
是的,这本书是错的,你是对的,请扔掉那本书 另外,请让每个人都知道这本书的名称,这样我们就可以永久地把它放在我们永远不推荐的黑名单中。
答案 1 :(得分:7)
使用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()内部如何工作的确切细节未在规范中定义,实际上它是一个具有明确定义接口的黑盒子。要了解它在实现中的工作原理,您需要查看一个开源实现的示例。但malloc()可以(并且确实)在各种平台上变化很大。