C malloc函数的大小参数

Mat*_*han 0 c memory malloc gcc pointers

我正在读一本书中的C语言中的malloc函数获取您希望作为参数分配的内存的"块"数,并根据您将malloc返回的值转换为多少来确定块的数量.例如,在我的系统上,int是4个字节:

int *pointer;

pointer = (int *)malloc(10);
Run Code Online (Sandbox Code Playgroud)

将分配40个字节,因为编译器知道int是4个字节.

这让我感到困惑有两个原因:

  1. 我正在阅读,size参数实际上是你想要分配的字节数,与任何类型的大小无关.

  2. Malloc是一个返回地址的函数.它如何根据从void返回到不同类型的地址的外部强制转换来调整它分配的内存大小?它只是我应该接受的一些编译器魔法吗?

我觉得这本书错了.非常感谢任何帮助或澄清!

这是本书所说的:

char *string;
string = (char *)malloc(80);
Run Code Online (Sandbox Code Playgroud)

80个预留了80块存储空间.块大小由类型转换(char*)设置,这意味着malloc()正在查找80个字符的文本存储.

Alo*_*ave 8

是的,这本书是错的,你是对的,请扔掉那本书.
另外,请让每个人都知道这本书的名称,这样我们就可以永久地把它放在我们永远不推荐的黑名单中.

好读:
malloc的最佳实践是什么?


Ran*_*ard 7

使用时malloc(),使用sizeof运算符并将其应用于正在分配的对象,而不是的类型.

不是一个好主意:

int *pointer = malloc (10 * sizeof (int)); /* Wrong way */ 
Run Code Online (Sandbox Code Playgroud)

更好的方法:

int *pointer = malloc (10 * sizeof *pointer);
Run Code Online (Sandbox Code Playgroud)

基本原理:如果更改指针指向的数据类型,则无需更改malloc()调用.维护胜利.

此外,此方法在代码开发期间不易出错.你可以检查它是否正确,而不必在除了变量声明之外发生malloc()调用的情况下查看声明.

关于有关转换malloc()的问题,请注意今天不需要在C中的malloc()上进行转换.此外,如果数据类型应在将来的版本中更改,那么任何强制转换都必须更改,或者是另一个错误源.此外,始终确保您已<stdlib.h>包括在内.通常人们会在演员阵容中摆脱因没有包含文件而导致的警告.另一个原因是它在C++中是必需的,但是您通常不编写使用malloc()的C++代码.

关于malloc()内部如何工作的确切细节没有在规范中定义,实际上它是一个具有明确定义的接口的黑盒子.要了解它在实现中的工作原理,您需要查看一个开源实现的示例.但是malloc()可以(并且确实)在各种平台上变化很大.