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个字节.
这让我感到困惑有两个原因:
我正在阅读,size参数实际上是你想要分配的字节数,与任何类型的大小无关.
Malloc是一个返回地址的函数.它如何根据从void返回到不同类型的地址的外部强制转换来调整它分配的内存大小?它只是我应该接受的一些编译器魔法吗?
我觉得这本书错了.非常感谢任何帮助或澄清!
这是本书所说的:
char *string;
string = (char *)malloc(80);
Run Code Online (Sandbox Code Playgroud)
80个预留了80块存储空间.块大小由类型转换(char*)设置,这意味着malloc()正在查找80个字符的文本存储.
使用时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()可以(并且确实)在各种平台上变化很大.