C - 如何将malloc struct包含字符串和数组?

时间:2016-02-17 20:55:53

标签: c arrays struct malloc

说,我有一些像这样的结构:

typedef struct node {
    char[32] name;
    int *contents[10];
} Node;

我想初始化一个新节点并将其存储在堆上,我是否还需要malloc空间的名称和整数? 但是,如果我尝试为它们使用malloc空间,例如:

Node *new_node = malloc{...};
new_node->name = malloc{32 * sizeof(char)};
...

我收到错误,说名字不可转让。

3 个答案:

答案 0 :(得分:1)

为了避免混淆,并使代码可维护,请像这样做

Node *new_node = malloc(sizeof(*new_node));
if (new_node == NULL)
   allocation_error_do_not_continue();

如果您检查sizeof(*new_node)sizeof(Node)相同,则10 * sizeof(int *) + 32 sizeof(char)虽然sizeof(char)始终为1 10 * sizeof(int *) + 32

这并不是要求结构的定义可用,以便sizeof运算符能够给出结构的大小。

另外,你建议malloc()成员name成员,name成员是一个数组而你无法分配它,它有足够的空间容纳31个字符的字符串你可以通过分配给每个元素,或使用strcpy() / memcpy()将完整数组复制到它来使用。但是您无法分配它,并且您不需要malloc()空间,因为malloc()结构已经malloc()两个数组。

答案 1 :(得分:1)

为结构分配空间Node *new_node = malloc(sizeof(Node));时,包含每个结构元素的空间。

在这种情况下,其中包含32 char和10 int *的空格。因此,您不需要为name数组分配空间,但根据您的使用情况,您可能会为contents的每个元素分配空间。

答案 2 :(得分:0)

通常的习语是

Node *new_node = malloc(sizeof *new_node);

这可确保为new_node分配的空间足够,即使您更改其类型也是如此。如果您使用sizeof (Node),则很容易错误地更改new_node的类型并且无法更新sizeof表达式。

您的代码

node->name = malloc(32 * sizeof(char));

将无法编译,因为node->name不是指针类型;它是Node类型中的一个数组,当您malloc()new_node时,就会分配存储空间。所以你可以继续使用那个存储空间。

请注意,根据定义,sizeof (char)为1,通常会写上面的

node->name = malloc(32);  // still can't assign to node->name, though!