>想象一下我有以下结构
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
一起使用,第二个在没有标记结构的情况下使用。