c - 为 C 中的结构分配内存时,哪个是正确的

标签 c struct memory-management

假设我们有一个像这样的简单结构:

typedef struct
{
    int d1;
    int d2;
    float f1;
}Type;

为它的新实例分配内存时,哪个是正确的:

这个:

// sizeof *t == sizeof(Type) ( gcc prints 12 bytes)
Type *t = malloc(sizeof *t); 

或:

// sizeof pointer always == 4 (in my case also on gcc)
Type *t = malloc(sizeof(t)); 

哪个是正确的?

最佳答案

正确的做法是:

Type *t = malloc(sizeof *t); 

为什么这是正确的?

因为您正确地分配了一个足够大的大小来容纳一个结构。 *t 指向一个类型Type


这是不正确的方式:

Type *t = malloc(sizeof(t)); 

为什么这是不正确的?

sizeof(t) 返回指针的大小而不是实际类型(即:不是结构的大小)。
您需要分配的大小足以容纳一个大小不等于结构指针的结构。

请注意,指向Any 类型的指针的大小在系统上是相同的。


为什么第一种方法更好?
使用第一种方法时,当您更改 Type 时,malloc 会自动将大小更改为正确的值,与其他方法不同,您不必显式地执行此操作。

此外,编写 malloc 调用的重要部分是找到需要传递的正确大小。最好的方法是不要看任何地方(因为那是我们犯错误的时候),而只看这个 malloc 语句的左侧。因为,在这种情况下它是 t,因此正确的大小将是 sizeof(*t)

如何规范malloc的使用?

使用上面提到的正确方法有一个问题,如果我们想 malloc30 个元素。然后我们的 malloc 表达式变成:

t = (T *) malloc(30 * sizeof (*T));

这不是编写 malloc 表达式的首选方法,因为在 malloc 中输入数字 30 可能会出错范围。我们想要什么 - 无论需要多少元素,malloc 参数都应该始终是标准的 sizeof(*x) 或类似的东西。

所以这是一个带有示例的方法:

假设我们有一个指针p,指向一个大小为20的一维数组,它的每个元素都是struct node。声明将是:

 struct node (*p) [20];   

现在,如果我们希望 malloc 20 elements of stuct node,并且希望指针 p 应该持有malloc 的返回地址然后我们有

p = (data-type of p) malloc (size of 20 elements of struct node); 

要找到p 的数据类型,为了强制转换,我们只需让变量名消失或将p 替换为空白。所以我们现在有

p = (struct node (*)[20] ) malloc(size of 20 elements of struct node);

我们不能在这里出错,因为如果我们错了,编译器会报错。尺寸终于出来了!我们只是按照我们描述的标准方式,即

p =  (struct node (*)[20] ) malloc(sizeof (*p));

我们完成了!

关于c - 为 C 中的结构分配内存时,哪个是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7372580/

相关文章:

c - 如何将字符串扫描到结构数组?

c++ - 在结构中指定设备特定功能

c - 在 C 中初始化一个结构

c++ - 获取存储在 C++ 集合中的结构中的值

c++ - 如何使用 STL 正确跟踪地址?

ios - 使用BOOL创建NSDictionary时收到EXC_BAD_ACCESS(Code = EXC_ARM_DA_ALIGN)

c++ - 旋转矩阵的方向 vector

c - 如何在 C 中将一个 char 数组的整个值分配到另一个数组的一个位置为十六进制格式?

iOS - 一次不分配太多内存

java - 为什么静态变量在 Java 方法中不允许像在 C/C++ 函数中那样?