局部变量可能尚未初始化

时间:2019-01-12 19:20:32

标签: c

我正在尝试从主函数中调用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);

}

1 个答案:

答案 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;

但是请注意,在这种情况下,在关闭声明它的块(即)后,该内存将无效。 }之后!因此,如果要从函数返回它,请不要使用它。