使用Sizeof的malloc结构指针的正确方法是什么?



>想象一下我有以下结构

struct Memory {
    int type;
    int prot;
};
typedef struct Memory *Memory;

我将如何使用 malloc(( 初始化它?

Memory mem = malloc(sizeof(Memory));

Memory mem = malloc(sizeof(struct Memory));

正确的分配方法是什么?

你的结构声明有点混乱,typedef 在很多层面上都是错误的。这是我的建议:

//typedef + decl in one
typedef struct _memory {
    int type;
    int prot;
} Memory;

然后像这样分配:

Memory *mem = malloc(sizeof *mem);

像这样阅读malloc调用:">分配存储mem指向的任何类型所需的内存量"。如果您将Memory *mem更改为 Memory **mem ,它将分配 4 或 8 个字节(取决于平台(,就目前而言,它可能会分配 8 个字节,具体取决于int的大小以及编译器如何填充结构检查 wiki 以获取更多详细信息和示例。

使用 sizeof *<the-pointer> 通常被认为是分配内存的更好方法,但如果需要,您可以编写:

Memory *mem = malloc(sizeof(Memory));
Memory *mem = malloc(sizeof(struct _memory));

他们都做同样的事情。请注意,如果您typedef结构,那可能是因为您想抽象某些东西的内部工作原理,并想要编写各种 API。在这种情况下,您应该尽可能不鼓励使用struct _memory,而赞成Memory*<the-pointer>

如果你想typedef指针,那么你可以这样写:

typedef struct _memory {
    int type;
    int prot;
} *Memory_p;

在这种情况下,这:

Memory_p mem = malloc(sizeof *mem);

可能看起来违反直觉,但是正确的,如下所示:

Memory_p mem = malloc(sizeof(struct _memory));

但是这个:

Memory_p mem = malloc(sizeof(Memory_p));

是错误的(它不会分配结构所需的内存,而是分配用于存储指向它的指针的内存(。

这也许是个人喜好的问题,但我个人认为typedef晦涩的某些事情。在许多情况下,这是更好的(即FILE*(,但是一旦API开始隐藏您正在使用指针的事实,我就开始有点担心了。它往往会使代码更难阅读、调试和记录......

可以这样想:

int *pointer, stack;

*运算符修改给定类型的变量,指针 typedef 同时执行这两项操作。这只是我的观点,我相信有很多程序员比我更熟练,他们确实使用指针类型定义。
但是,大多数时候,指针typedef伴随着自定义分配器函数或宏,因此您不必编写像Memory_p mem = malloc(sizeof *mem);这样的奇怪语句,而是可以编写可以定义为ALLOC_MEM_P(mem, 1);

#define ALLOC_MEM_P(var_name, count) Memory_p var_name = malloc(count * sizeof *var_name)

什么的

两者

 typedef struct Memory * Memory;

 Memory mem = malloc (sizeof (Memory));

错了。正确的方法是:

typedef struct memory
{
     int type;
     int prot;
} *MEMPTR;

struct memory
{
     int type;
     int prot;
};
typedef struct memory *MEMPTR;

结构的名称应不同于指向它的指针的名称。

此结构

struct {
    int type;
    int prot;
} Memory;

定义具有名称Memory的对象,该对象具有未命名结构的类型。

因此下一个建筑

typedef struct Memory *Memory;

定义 1( 与上述定义和名称 Memory 没有任何共同点的新类型struct Memory。 2( 另一个新类型名称Memory,它是指向struct Memory的指针。

如果这两个结构存在于同一个编译单元中,则编译器将发出错误,因为 typedef 声明中的 name Memory(指针的名称(试图重新声明具有相同名称的未命名结构类型的对象Memory

我想你的意思是以下几点

typedef struct Memory {
    int type;
    int prot;
} Memory;

在这种情况下,您可以使用使用malloc的两个记录,例如

Memory *mem = malloc( sizeof( Memory ) );

struct Memory *mem = malloc( sizeof( struct Memory ) );

Memory *mem = malloc( sizeof( struct Memory ) );

struct Memory *mem = malloc( sizeof( Memory ) );

因为现在两个标识符 Memory 位于两个不同的命名空间中,第一个与标记 struct 一起使用,第二个在没有标记结构的情况下使用。

相关内容