使用链表从列表的头部提取数据。数据已经在头中设置了,但当我试图访问它时,我得到了那个错误。我认为指针有问题,但我不能解决它。
int main(int argc, char **argv)
{
int i;
struct timeval start, end;
struct element *Head = NULL;
struct element *Tail = NULL;
//creating job queue
for (i = 0; i < NUMBER_OF_JOBS; i++) {
addLast(generateProcess(), &Head, &Tail);
}
//go through job queue running processes and removing processes
while (Head) {
runPreemptiveJob(Head->pData, &start, &end);
int responseTime = getDifferenceInMilliSeconds(Head->pData->oTimeCreated, start);
printf("Response Time is: %d\n", responseTime);
Head = Head->pNext;
}
}
我希望能够通过head元素访问oTimeCreated中的数据,该元素在其数据字段中有一个结构。
错误是在调用getDifferenceInMilliSeconds函数时出现的:我在头上得到了一个错误,上面写着“表达式必须具有指向结构或联合类型的指针。
元素如下所示:
struct element
{
void * pData;
struct element * pNext;
};
generateProcess()返回一个结构进程,定义如下:
struct process
{
int iProcessId;
struct timeval oTimeCreated;
struct timeval oMostRecentTime;
int iInitialBurstTime;
int iPreviousBurstTime;
int iRemainingBurstTime;
int iPriority;
};
在main函数中,generateProcess()返回一个指向进程的指针。这个指针被放到链表中,所以我试图访问oTimeCreated变量,它是链表头部结构的一部分。
发布于 2019-10-18 06:23:34
错误不是关于Head
的,而是关于Head->pData
的。密切关注错误消息。对于某些编译器,错误消息可以清楚地标识一行,但不能明确该行中的确切位置;如果编译器的错误不明确,如果添加换行符并创建更多中间变量,则可以获得更精确的错误位置。
void *data = Head->pData;
struct timeval time_created = data->oTimeCreated;
int responseTime = getDifferenceInMilliSeconds(time_created, start);
请注意,要以这种方式编写代码,我必须为中间表达式Head->pData
和data->oTimeCreated
指定类型。为了弄清楚应该提供什么类型,我查看了struct element
和struct process
的定义。
特别是,Head->pData
的类型是void*
。这是一个指向未指定类型的指针。您不能取消对它的引用,尤其是data->oTimeCreated
会导致编译错误,因为data
不是指向结构或联合的指针。未指定的类型不是结构或联合。
C语言中并没有内置polymorphism。它允许通过空指针实现多态,但就像C中的许多事情一样,你需要自己做一些工作。如果只有一个空指针指向对象,C不会跟踪对象的实际类型。你必须指定什么时候你想要取消引用指针,并且你需要正确地去做,否则就是anything can happen。
如果您确定您放在列表中的是指向仍然有效的struct process
的指针,那么将空指针转换或强制转换为指向struct process
的指针。这是一种惯用的方法:
struct process *head_process = Head->pData;
runPreemptiveJob(head_process, &start, &end);
int responseTime = getDifferenceInMilliSeconds(head_process->oTimeCreated, start);
https://stackoverflow.com/questions/58419675
复制相似问题