gpt4 book ai didi

c - 表达式必须具有指向结构或 union 的指针类型?

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:05 26 4
gpt4 key购买 nike

使用链表从链表的头部提取数据。数据已在 Head 中设置,但当我尝试访问它时出现该错误。认为指针存在问题,但我无法解决。

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 函数时出现的:我在 Head 上收到一个错误,提示“表达式必须具有指向结构或 union 类型的指针。

元素显示在这里:

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;
};

在主函数中,generateProcess() 返回一个指向进程的指针。这个指针被放入链表中,所以我试图访问 oTimeCreated 变量,它是列表头部结构的一部分。

最佳答案

错误不是关于Head,而是关于Head->pData。请密切注意错误消息。对于某些编译器,错误消息清楚地标识了一行,但没有标识行内的确切位置;如果你的编译器的错误不清楚,你可以通过添加换行符和创建更多的中间变量来获得更精确的错误位置。

void *data = Head->pData;
struct timeval time_created = data->oTimeCreated;
int responseTime = getDifferenceInMilliSeconds(time_created, start);

请注意,要以这种方式编写代码,我必须为中间表达式 Head->pDatadata->oTimeCreated 指定类型。为了找出要提供的类型,我查看了 struct elementstruct process 的定义。

特别是Head->pData的类型是void*。那是指向未指定类型的指针。您不能取消引用它,特别是 data->oTimeCreated 会导致编译错误,因为 data 不是指向结构或 union 的指针。未指定的类型不是结构或 union 。

C 没有 polymorphism融入语言。它允许通过 void 指针实现多态性,但与 C 中的许多事情一样,您需要自己完成一些工作。如果您只有一个指向对象的 void 指针,C 不会跟踪对象的实际类型。您必须指定何时要取消引用指针,并且需要正确设置,否则 anything can happen .

如果您确定放入列表中的是指向仍然有效的 struct process 的指针,则将 void 指针转换或强制转换为指向 struct process 的指针。这是一种惯用的方法:

struct process *head_process = Head->pData;
runPreemptiveJob(head_process, &start, &end);
int responseTime = getDifferenceInMilliSeconds(head_process->oTimeCreated, start);

关于c - 表达式必须具有指向结构或 union 的指针类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58419675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com