在C中创建新结构时,如何正确分配足够的内存(malloc)



给定下面的结构,我将创建一个接收person_in_queueposition_num的函数,并分配一个新的queue_t结构,该结构添加到第一个参数指定的queue_t结构列表的末尾。

typedef struct queue {
int position_num;
char *person_in_queue;
struct queue *next_in_line;
} queue_t;

我已经这样写了我的代码:

queue_t *add_to_queue(queue_t *input_queue, char *person_in_queue, int position_num) {
input_queue = malloc(sizeof(queue_t));
assert(input_queue != NULL);
input_queue->position_num = position_num;
input_queue->person_in_queue = (char *) malloc((strlen(new_text) + 1) * sizeof(char));
assert(input_queue->person_in_queue != NULL);
strcpy(input_queue->person_in_queue, person_in_queue);
return input_queue;
}

所说的代码编译,然而,我被告知我的代码失败了,因为分配的内存比预期的要少。目前,我不确定我在哪里出了问题。请注意,我需要使用malloc()

非常感谢!

sizeof是C中的运算符,而不是函数,但圆括号是计算类型所必需的。

若要为结构分配内存,请使用类型的大小。

input_queue = malloc(sizeof (queue_t));

或者使用取消引用的指针或对象大小(此处不需要括号(。

input_queue = malloc(sizeof *input_queue);

我被告知,由于分配的内存少于预期,我的代码失败了。

必须引用malloc((strlen(new_text) + 1) * sizeof(char))。显然,new_text是一个全局字符串,与person_in_queue没有可见的连接,后者将被复制。将呼叫更改为malloc(strlen(person_in_queue) + 1)

在C中创建新结构时,如何正确分配足够的内存(malloc(?

除此之外,分配基本上是可以的,但正如Marco Bonelli所指出的,您将input_queue作为参数并立即覆盖它…这没有多大意义…如果input_queue最初是NULL,则返回分配的queue_t对象是有意义的,否则传递的input_queue不变。这可以通过将函数体的前两个语句更改为来实现

queue_t *head_queue = input_queue, **pr = &input_queue;
while (*pr) pr = &(*pr)->next_in_line;  // find end of list
*pr =   // link new struct to list
input_queue = malloc(sizeof(queue_t));
assert(input_queue != NULL);
input_queue->next_in_line = NULL;       // don't forget to initialize!

以及的返回语句

return head_queue ? head_queue : input_queue;

-前者也正确地设置了链接指针CCD_ 17。

最新更新