使用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 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; 

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

您的结构声明有点混乱,并且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 *通常被认为是分配内存的更好方法,但是你想要的,你可以写:

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

他们都做同样的事情。 请注意,如果你输入一个结构,那可能是因为你想要抽象某些东西的内部运作,并且想要编写各种各样的API。 在这种情况下,你应该尽可能地阻止使用struct _memory ,无论如何都支持Memory*

如果你想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技术要熟练得多。
但是大多数情况下,指针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) 

或者其他的东西

这种结构

 struct { int type; int prot; } Memory; 

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

这样下一步施工

 typedef struct Memory *Memory; 

定义1)一个新类型struct Memory ,与上面的定义和名称Memory没有任何共同之处。 2)另一个新类型名称Memory是指向struct Memory指针。

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

我想你的意思是以下几点

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

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

 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而第二个用于没有标记struct。