C malloc函数的大小参数

时间:2013-04-06 04:15:34

标签: c pointers memory gcc malloc

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

int *pointer;

pointer = (int *)malloc(10);

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

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

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

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

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

    这本书就是这样说的:

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

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

2 个答案:

答案 0 :(得分:8)

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

好读:
What is the Best Practice for malloc?

答案 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()可以(并且确实)在各种平台上变化很大。