【发布时间】:2017-02-08 21:40:31
【问题描述】:
我在这里缺乏对指针的理解。 foo1 是 foo 类型的指针。在 dequeue 中,有一个 foo 类型的项目列表,这些项目是由 queueList 传入的动态分配的。我的任务是让 foo1 指向队列的头部,但是,访问传递给 dequeue() 的 foo1 指针*data 会导致段错误。这是我缺乏理解的地方。 *data 不是指 foo1 指针吗?
struct foo
{
//Properties Here
};
int main()
{
struct foo* foo1;
dequeue(myQueueList, (void*) foo1);
}
void dequeue(struct queue* queueList, void **data)
{
*data = NULL; //Causes Seg fault if I do this too
*data = queueList->head->data; //Seg fault if I do this as well
return;
}
我的队列定义为:
struct queue
{
node * head;
//other stuff
};
struct node
{
void * data;
//other stuff
};
编辑: foo1 未在 main 中初始化。我想通过将其设置为等于已入队的不同 struct foo* 指针来在出队中对其进行初始化。
Edit2: queue 包含一个 struct foo* 指针列表。
Edit3:感谢 wildplasser,它使用 (void*)foo1 -> (void*)&foo1 修复。但是为什么我必须使用 &foo1 而不是 (void*)?
【问题讨论】:
-
dequeue(myQueueList, (void*) foo1);-->>dequeue(myQueueList, &foo1);另外:你的 *foo1 指针不指向任何地方;没有它指向的 foo 对象,并且它不是 NULL。 -
@wildplasser 为什么当 foo1 在出队中初始化时 foo1 需要 NULL?我想要的是 foo1 指向堆中的另一个 foo 类型。还是我想错了?我想要相当于: struct foo* foo1 = queueList->head->data;其中 data 是 void* 类型。
-
是
queueList->head->data一个struct foo*类型伪装成void*? -
在这种情况下不需要它。但是当非 NULL 时,出队例程可以做不同的事情(例如解除分配,或根本不分配)。未初始化的数据(通常)只是一个坏习惯。 Ald 将指针 作为返回值返回 根本不需要任何指向指针的指针。
-
data是一个未初始化的指针,所以你不能取消引用它。呵呵。
标签: c pointers void-pointers