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