学习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?
谢谢!
答案 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
函数中的结构分配了内存,因此您无需再次执行此操作。
实际上,该行正在做的是分配内存,将其分配给指针(并记住参数是通过值传递的,因此它会覆盖本地副本)并且您只更改了该结构该函数,而不是通过该函数传递的函数。