我不知道下一个任务是什么意思:
struct reportItem * itemCopy = (struct reportItem *) malloc(sizeof(struct reportItem))
有人可以逐步解释我的分配吗?我真的不知道这是什么意思。
谢谢
struct reportItem *itemCopy = (struct reportItem *) malloc(sizeof(struct reportItem));
// ^^^^^^^^^^^^^^^^^^^^^
强制转换是不必要的,并且可能隐藏编译器在没有它的情况下会捕获的错误 (1)
struct reportItem *itemCopy = malloc(sizeof(struct reportItem));
// ^^^^^^^^^^^^^^^^^^^
在这里使用类型本身可能被视为“等待发生的意外”(2)。使用对象本身更安全
struct reportItem *itemCopy = malloc(sizeof *itemCopy);
所以现在这是一个很好看的声明:)
这将调用库函数malloc()(它试图保留一块内存区域供程序使用)并将结果值分配给itemCopy.
程序员有责任在使用该内存之前malloc()检查是否设法保留该内存。
if (itemCopy == NULL) {
//malloc failed to reserve memory
fprintf(stderr, "no memory.\n");
exit(EXIT_FAILURE);
}
一旦不再需要该内存,程序员还负责释放内存(返回给操作系统)。
//use itemCopy
free(itemCopy);
(1) 演员隐藏错误
如果编译器范围内没有原型,malloc()则假定它返回一个int. 然后,使用强制转换将非法int(非法,因为它实际上是一个void*值)默默地转换为指针。错误是缺少 the#include <stdio.h>和 cast。如果您只是删除强制转换,编译器会抱怨从int到指针的转换。如果您#include <stdio.h>保留演员阵容,则它是多余的(并且多余的是不好的)。
(2) 使用类型来确定要分配的内存量是“等待发生的意外”
该调用malloc(sizeof(struct whatever))是“等待发生的意外”,因为它迫使程序员在不止一个地方更改代码,只更改一个结构。
让我们想象有一个struct Car具有一些属性的...稍后它决定将部分代码更改为新修改的代码struct Vehicle(同时保持struct Car活动状态)。在调用中使用类型名称会malloc()强制进行 2 次更改
struct Vehicle *x = malloc(sizeof (struct Vehicle));
// ^^^^^^^^^^^^^^^^ prevented accident
使用该对象时只需进行一次更改
struct Vehicle *x = malloc(sizeof *x);
// ^^ *x is of the correct type
struct reportItem是先前声明的结构类型。C 中的结构基本上是可以分段读取的数据块,其中每个部分都有一个类型和一个名称。第一部分声明了一个指针itemCopy,它只是一个存储内存地址的变量。struct reportItem只是告诉编译器那个内存地址的数据应该被解释为一个结构reportItem。malloc是一个分配内存来存储东西的函数。你告诉它你需要多少字节的内存,它会返回一个指针,保存新分配的内存的第一个字节的地址。sizeof返回对象或对象类型的大小(以字节为单位)。在这种情况下,它会分配足够的内存来存储一个reportItem结构。从返回的指针malloc然后被强制转换为声明的指针类型,并且itemCopy被分配保存该地址。
sizeof(struct reportItem)返回数据类型 struct reportItem 占用的大小
malloc在这种情况下分配请求的字节,无论sizeof(struct reportItem)返回什么
(struct reportItem *)用于对 malloc 返回的值进行类型转换。但是这不是必需的,您可以检查更多信息,我需要强制转换 malloc 吗?
struct reportItem* ItemCopy 然后被分配给reportItem 占用大小的固定内存的基地址。