我正在尝试从主函数中调用queue_t
,以提供queue_t
的大小,然后将其打印出来以进行测试。
为什么在第21行中没有初始化我的q
?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct queue_t {
char *name;
int size;
int entries;
double time;
struct packet_t **packets;
int read;
int write;
long lost;
};
struct queue_t *queue_create (char *name, int size) {
int i;
struct queue_t *q;
q->size = size;
q->name = name;
printf("Name of queue: %s", q->name);
printf("Size of queue: %d", q->size);
return (q);
}
int main () {
char *a = "Test";
int size = 80;
queue_create(a, size);
}
答案 0 :(得分:2)
struct queue_t *q;
q->size = size;
这里显然未初始化指针q
。然后在q->size
中使用它。您应该在使用之前分配/初始化变量,即。 q = something;
。使用未初始化的指针值可能是未定义的行为。
您可以:
struct queue_t *q = malloc(sizeof(*q));
if (q == NULL) { fprintf(stderr, "ERROR! malloc!\n"); abort(); }
q->size = size;
q
在此处明确分配了一个值,即。 malloc()
调用的结果。它为堆上的queue_t分配内存。请记住要free()
指针,以便您的程序不会泄漏内存。
您还可以为堆栈上的变量分配内存:
struct queue_t q_memory;
struct queue_t *q = &q_memory;
q->size = size;
但是请注意,在这种情况下,在关闭声明它的块(即)后,该内存将无效。 }
之后!因此,如果要从函数返回它,请不要使用它。