给定下面的结构,我将创建一个接收person_in_queue
和position_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。