如何将我的指针初始化为NULL

时间:2014-04-29 12:41:03

标签: c pointers

学习C,我试图实施一个小程序。我有两个这样的结构:

typedef struct QueueNode_ QueueNode;
typedef struct TQueue_ TQueue;

struct QueueNode_ {
    QueueNode* next;
    const Task task;
};

struct TQueue_ {
    QueueNode* first;
    QueueNode* last;
};

接下来我定义了一个初始化队列的方法:

void initializeQueue(TQueue* queue){
    queue = malloc(sizeof(TQueue)); //check if malloc returns NULL!
    queue->first = NULL;
    printf("%d", queue->first == NULL);
    queue->last = NULL;
}

主要:

int main() {
    puts("TQueue example:");

    TQueue q;
    initializeQueue(&q);
    printf("%d", q.first == NULL);
}

我虽然上面会打印11,但会打印10,这意味着我的指针first未设置为null。我很确定我会错过一些基本的东西......

为什么以上打印10以及如何在我的initializeQueue方法中将第一个指针正确初始化为NULL?

谢谢!

2 个答案:

答案 0 :(得分:5)

问题是在C中,参数总是按值传递,除非作为指针显式传递,所以一般来说你不应该直接分配参数:它很混乱。

void initializeQueue(TQueue* queue) {
    queue = malloc(sizeof(TQueue)); //check if malloc returns NULL!

请参阅?进入函数后,queue指向main的队列,但随后您分配了一个新结构并使queue指向它。所以来自main的队列永远不会被初始化!

解决方案,删除malloc

void initializeQueue(TQueue* queue){
    queue->first = NULL;
    printf("%d", queue->first == NULL);
    queue->last = NULL;
}

或者,如果您更喜欢完全动态,不要将队列作为参数但返回新分配的队列:

TQueue *initializeQueue(){
    TQueue* queue = malloc(sizeof(TQueue)); //check if malloc returns NULL!
    queue->first = NULL;
    printf("%d", queue->first == NULL);
    queue->last = NULL;
    return queue;
}

并相应地修改main功能。

答案 1 :(得分:3)

这一行是错误的:

queue = malloc(sizeof(TQueue)); //check if malloc returns NULL!

您已经为main函数中的结构分配了内存,因此您无需再次执行此操作。

实际上,该行正在做的是分配内存,将其分配给指针(并记住参数是通过值传递的,因此它会覆盖本地副本)并且您只更改了该结构该函数,而不是通过该函数传递的函数。