C 表达式必须具有指向结构或联合类型的指针?
使用链接列表从列表的开头提取数据。数据已经设置在头部,但是当我试图访问它时,我得到了错误。我认为指针有问题,但我无法解决C 表达式必须具有指向结构或联合类型的指针?,c,pointers,void-pointers,C,Pointers,Void Pointers,使用链接列表从列表的开头提取数据。数据已经设置在头部,但是当我试图访问它时,我得到了错误。我认为指针有问题,但我无法解决 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 &l
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;
}
}
generateProcess()返回结构进程,定义如下:
struct process
{
int iProcessId;
struct timeval oTimeCreated;
struct timeval oMostRecentTime;
int iInitialBurstTime;
int iPreviousBurstTime;
int iRemainingBurstTime;
int iPriority;
};
在main函数中,generateProcess()返回指向进程的指针。这个指针被放入链表中,因此我试图访问oTimeCreated变量,它是列表头结构的一部分 错误不是关于
Head
,而是关于Head->pData
。请密切注意错误消息。对于某些编译器,错误消息可以清楚地识别一行,但不能识别行中的确切位置;如果编译器的错误不清楚,如果添加换行符并创建更多中间变量,则可以获得更精确的错误位置
void *data = Head->pData;
struct timeval time_created = data->oTimeCreated;
int responseTime = getDifferenceInMilliSeconds(time_created, start);
注意,要以这种方式编写代码,我必须为中间表达式Head->pData
和data->oTimeCreated
指定类型。为了弄清楚要给出什么类型,我查看了struct元素
和struct进程
的定义
尤其是Head->pData
的类型是void*
。这是指向未指定类型的指针。您不能取消引用它,尤其是data->oTimeCreated
会导致编译错误,因为data
不是指向结构或联合的指针。未指定的类型不是结构或联合
C语言没有融入到语言中。它允许通过空指针进行多态性,但与C中的许多事情一样,您需要自己完成一些工作。如果只有一个指向对象的空指针,C就不会跟踪对象的实际类型。您必须指定何时取消对指针的引用,否则您需要将其设置正确
如果确定列表中的指针指向仍然有效的struct进程
,则将空指针转换或强制转换为指向struct进程
的指针。下面是一个惯用的方法:
struct process *head_process = Head->pData;
runPreemptiveJob(head_process, &start, &end);
int responseTime = getDifferenceInMilliSeconds(head_process->oTimeCreated, start);
错误不是关于
Head
,而是关于Head->pData
。请密切注意错误消息。对于某些编译器,错误消息可以清楚地识别一行,但不能识别行中的确切位置;如果编译器的错误不清楚,如果添加换行符并创建更多中间变量,则可以获得更精确的错误位置
void *data = Head->pData;
struct timeval time_created = data->oTimeCreated;
int responseTime = getDifferenceInMilliSeconds(time_created, start);
注意,要以这种方式编写代码,我必须为中间表达式Head->pData
和data->oTimeCreated
指定类型。为了弄清楚要给出什么类型,我查看了struct元素
和struct进程
的定义
尤其是Head->pData
的类型是void*
。这是指向未指定类型的指针。您不能取消引用它,尤其是data->oTimeCreated
会导致编译错误,因为data
不是指向结构或联合的指针。未指定的类型不是结构或联合
C语言没有融入到语言中。它允许通过空指针进行多态性,但与C中的许多事情一样,您需要自己完成一些工作。如果只有一个指向对象的空指针,C就不会跟踪对象的实际类型。您必须指定何时取消对指针的引用,否则您需要将其设置正确
如果确定列表中的指针指向仍然有效的struct进程
,则将空指针转换或强制转换为指向struct进程
的指针。下面是一个惯用的方法:
struct process *head_process = Head->pData;
runPreemptiveJob(head_process, &start, &end);
int responseTime = getDifferenceInMilliSeconds(head_process->oTimeCreated, start);
请编辑您的问题,以包含您得到的确切错误。请此代码段不包含所有必需的信息。显示
元素
的声明及其引用的任何其他结构。请努力并正确设置代码格式。听起来头->pData
不是指针。如果您显示了struct元素的定义,就会很清楚。请编辑您的问题,以包含您得到的确切错误。请此代码段不包含所有必需的信息。显示元素
的声明及其引用的任何其他结构。请努力并正确设置代码格式。听起来头->pData
不是指针。如果您显示了struct元素的定义,就会很清楚。