-3

我不知道下一个任务是什么意思:

struct reportItem * itemCopy = (struct reportItem *) malloc(sizeof(struct reportItem))

有人可以逐步解释我的分配吗?我真的不知道这是什么意思。

谢谢

4

3 回答 3

2
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 
于 2018-10-13T15:11:45.737 回答
1

struct reportItem是先前声明的结构类型。C 中的结构基本上是可以分段读取的数据块,其中每个部分都有一个类型和一个名称。第一部分声明了一个指针itemCopy,它只是一个存储内存地址的变量。struct reportItem只是告诉编译器那个内存地址的数据应该被解释为一个结构reportItemmalloc是一个分配内存来存储东西的函数。你告诉它你需要多少字节的内存,它会返回一个指针,保存新分配的内存的第一个字节的地址。sizeof返回对象或对象类型的大小(以字节为单位)。在这种情况下,它会分配足够的内存来存储一个reportItem结构。从返回的指针malloc然后被强制转换为声明的指针类型,并且itemCopy被分配保存该地址。

于 2018-10-13T15:08:07.923 回答
1

sizeof(struct reportItem)返回数据类型 struct reportItem 占用的大小

malloc在这种情况下分配请求的字节,无论sizeof(struct reportItem)返回什么

(struct reportItem *)用于对 malloc 返回的值进行类型转换。但是这不是必需的,您可以检查更多信息,我需要强制转换 malloc 吗?

struct reportItem* ItemCopy 然后被分配给reportItem 占用大小的固定内存的基地址。

于 2018-10-13T15:15:10.073 回答