说,我有一些像这样的结构:
typedef struct node {
char[32] name;
int *contents[10];
} Node;
我想初始化一个新节点并将其存储在堆上,我是否还需要malloc空间的名称和整数? 但是,如果我尝试为它们使用malloc空间,例如:
Node *new_node = malloc{...};
new_node->name = malloc{32 * sizeof(char)};
...
我收到错误,说名字不可转让。
答案 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!