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

使用sizeof创建malloc结构指针的正确方法是什么?,c,C,假设我有以下结构 struct Memory { int type; int prot; }; typedef struct Memory *Memory; 我如何使用malloc初始化它 Memory mem = malloc(sizeof(Memory)); 或 正确的分配方法是什么?您的结构声明有点混乱,typedef在许多级别上都是错误的。以下是我的建议: //typedef + decl in one typedef struct _memory { in

假设我有以下结构

struct Memory {
    int type;
    int prot;
};

typedef struct Memory *Memory;
我如何使用malloc初始化它

Memory mem = malloc(sizeof(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的大小和编译器如何填充结构

使用sizeof*通常被认为是分配内存的更好方法,但如果您愿意,可以编写:

Memory *mem = malloc(sizeof(Memory));
Memory *mem = malloc(sizeof(struct _memory));
他们都做同样的事情。请注意,如果您键入一个struct,那可能是因为您想抽象某些东西的内部工作,并想编写一个API。在这种情况下,您应该尽可能不鼓励使用struct_内存,而应该支持内存或*无论如何

如果要键入定义指针,则可以编写以下命令:

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会模糊某些东西。在许多情况下,这是为了更好的ie文件*,但一旦API开始隐藏您正在使用指针的事实,我就开始有点担心了。它往往使代码更难阅读、调试和记录

就这样想吧:

int *pointer, stack;
*运算符修改给定类型的变量,指针typedef同时修改这两个变量。这只是我的观点,我相信有很多程序员比我更熟练,他们使用指针typedef。 但是,大多数情况下,指针typedef都伴随着自定义的分配器函数或宏,因此您不必编写类似Memory\p mem=mallocsizeof*mem;,之类的奇怪语句;,但是你可以写ALLOC_MEM_Pmem,1;可定义为:

#define ALLOC_MEM_P(var_name, count) Memory_p var_name = malloc(count * sizeof *var_name)
或者两者兼而有之

 typedef struct Memory * Memory;

你错了。正确的方法是:

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

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

此结构

struct {
    int type;
    int prot;
} Memory;
typedef struct Memory *Memory;
定义具有名称内存且类型为未命名结构的对象

因此,下一步的建设

struct {
    int type;
    int prot;
} Memory;
typedef struct Memory *Memory;
定义了一个新类型的结构内存,它与上面的定义和名称内存没有任何共同之处。和2另一个新类型名称内存,即指向结构内存的指针

如果两个构造都存在于同一个编译单元中,那么编译器将发出错误,因为名称内存typedef声明中指针的名称试图使用相同的名称内存重新声明未命名结构类型的对象

我想你的意思是

typedef struct Memory {
    int type;
    int prot;
} Memory;
在这种情况下,您可以使用malloc-like的两个记录

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


因为现在两个标识符内存在两个不同的名称空间中,第一个用于tag struct,第二个用于tag struct

您的typedef在很多级别上都是错误的。。。这是一场等待发生的事故,真的。无论哪种方式,都要写入结构内存{};然后像这样分配struct memory*mem=mallocsizeof*mem;您认为分配一个对象需要多少内存?可能是您要分配的对象类型的大小?@EliasVanOotegem谢谢。那么正确的尺寸应该是多少?是8字节还是4字节?@juanchopanza,这是我不确定的。我想使用我的结构作为指针,即mem->type=1;而不是mem.type=1。所以我的结构应该是8字节还是4字节?你真的应该花点时间学习什么是结构和指针,因为你似乎有一些误解。你不能用我的结构作为指针。我修复了我认为代码中的错误。请确认我没有破坏任何东西。@Anatolig谢谢。似乎有输入错误。即使在使用不完整/不透明类型的抽象隐藏结构成员的情况下,我仍然不会将指针隐藏在typedef中。因为如果这样做,用户会将该类型的变量视为数据块,而不是指针。如果类型不完整/不透明,则将分配留给该代码模块的成员函数,而不是用户@伦丁:我完全同意。我不认为指针typedef是个好主意,我想我已经说得很清楚了,如果没有,我会编辑我的答案。我也同意你的观点,如果你在某个标题中键入一个不完整的类型,你无论如何都需要提供一个完整的API,包括分配函数,比如不使用指针typedef但使用不完整类型的函数
Memory *mem = malloc( sizeof( Memory ) );
struct Memory *mem = malloc( sizeof( struct Memory ) );
Memory *mem = malloc( sizeof( struct Memory ) );
struct Memory *mem = malloc( sizeof( Memory ) );