1

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

int *pointer;

pointer = (int *)malloc(10);

将分配 40 个字节,因为编译器知道整数是 4 个字节。

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

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

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

感觉书错了 非常感谢任何帮助或澄清!

这本书是这么说的:

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

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

4

2 回答 2

8

是的,这本书是错的,你是对的,请扔掉那本书。
另外,一定要让大家知道这本书的名字,这样我们就可以将它永久地列入我们从不推荐的黑名单。

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

于 2013-04-06T04:17:16.730 回答
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() 可以(并且确实)在各种平台上变化很大。

于 2013-04-06T04:28:06.197 回答