了解C语言中具有结构和指针的变量

时间:2018-10-13 15:01:36

标签: c pointers struct malloc

我不知道下一次恋爱意味着什么

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

有人可以逐步解释我的恋爱经历吗?我真的不知道这是什么意思。

谢谢

3 个答案:

答案 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占用的大小的强制转换固定内存的基址。