在C中为结构分配内存

时间:2010-02-01 14:38:18

标签: c malloc structure

我的任务是创建一个为结构动态分配内存的程序。 通常我们会使用

x=malloc(sizeof(int)*y);

但是,我对结构变量使用了什么? 我认为不可能做到

struct st x = malloc(sizeof(struct)); 

有人可以帮帮我吗? 谢谢!

7 个答案:

答案 0 :(得分:62)

我的最爱:

#include <stdlib.h>

struct st *x = malloc(sizeof *x); 

请注意:

  • x必须是指针
  • 不需要演员
  • 包含适当的标题

答案 1 :(得分:6)

你做得不对。 struct st x是一个结构,而不是指针。如果你想在堆栈上分配一个,那很好。用于在堆上分配struct st * x = malloc(sizeof(struct st));

答案 2 :(得分:4)

struct st* x = malloc( sizeof( struct st ));

答案 3 :(得分:3)

这是完全可能的 - 并且是正确的方式

假设您打算输入

struct st *x = malloc(sizeof(struct st)); 

PS。即使您知道所有内容的大小,也必须执行sizeof(struct),因为编译器可能会填充结构以使成员对齐。

struct tm {
  int x;
  char y;
}

可能与

的大小不同
struct tm {
  char y;
  int x;
}

答案 4 :(得分:2)

这应该做:

struct st *x = malloc(sizeof *x); 

答案 5 :(得分:1)

struct st *x = (struct st *)malloc(sizeof(struct st));

答案 6 :(得分:-1)

我相信,当您在sizeof类型上调用struct时,C会在struct的字段上递归调用sizeof。因此,struct st *x = malloc(sizeof(struct st));仅在struct st具有固定大小时才有效。这只有在你的结构中有类似变量大小的字符串之类的东西时才有意义,而且你不想每次都给它一个最大长度。

一般来说,

struct st *x = malloc(sizeof(struct st));

的工作原理。有时候,你会遇到可变大小的结构或'抽象'结构(想想:来自Java的抽象类),编译器会告诉你它无法确定struct st的大小。在这些情况下,您必须手动计算大小并使用数字调用malloc,否则您将找到一个函数,该函数返回您想要的完全实现的malloc版本的结构。