我不知道下一次恋爱意味着什么
struct reportItem * itemCopy = (struct reportItem *) malloc(sizeof(struct reportItem))
有人可以逐步解释我的恋爱经历吗?我真的不知道这是什么意思。
谢谢
答案 0 :(得分: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
。
程序员{@ 1}在使用该内存之前,是否有责任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*
值,因此是非法的)转换为指针。 错误是缺少#include <stdio.h>
和强制转换。如果仅删除强制类型转换,则编译器会抱怨从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
答案 1 :(得分:1)
struct reportItem
是先前声明的结构类型。 C语言中的结构基本上是一个可以按部分读取的数据块,其中每个部分都有一个类型和一个名称。第一部分声明了一个指针itemCopy
,它只是一个存储内存地址的变量。 struct reportItem
仅告诉编译器该内存地址处的数据应解释为reportItem
结构。 malloc
是分配内存以存储事物的函数。您告诉它需要多少个字节的内存,它返回一个指针,该指针保存该新分配的内存的第一个字节的地址。 sizeof
返回对象或对象类型的大小(以字节为单位)。在这种情况下,它将分配足够的内存来存储一个reportItem
结构。然后将从malloc
返回的指针转换为声明的指针类型,并分配itemCopy
来保存该地址。
答案 2 :(得分:1)
sizeof(struct reportItem)返回数据类型struct reportItem占用的大小
malloc 在这种情况下分配请求的字节, sizeof(struct reportItem)
返回的结果(struct reportItem *)用于强制转换malloc返回的值。但是不是必需的,您可以检查更多do i need to cast malloc?
struct reportItem *然后为ItemCopy分配由reportItem占用的大小的强制转换固定内存的基址。