首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表达式必须具有指向结构或联合类型的指针?

表达式必须具有指向结构或联合类型的指针?
EN

Stack Overflow用户
提问于 2019-10-17 02:34:05
回答 1查看 2.3K关注 0票数 1

使用链表从列表的头部提取数据。数据已经在头中设置了,但当我试图访问它时,我得到了那个错误。我认为指针有问题,但我不能解决它。

代码语言:javascript
运行
复制
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函数时出现的:我在头上得到了一个错误,上面写着“表达式必须具有指向结构或联合类型的指针。

元素如下所示:

代码语言:javascript
运行
复制
struct element
{
    void * pData;
    struct element * pNext;
};

generateProcess()返回一个结构进程,定义如下:

代码语言:javascript
运行
复制
struct process
{
    int iProcessId;
    struct timeval oTimeCreated;
    struct timeval oMostRecentTime; 
    int iInitialBurstTime;
    int iPreviousBurstTime;
    int iRemainingBurstTime;
    int iPriority;
};

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-18 06:23:34

错误不是关于Head的,而是关于Head->pData的。密切关注错误消息。对于某些编译器,错误消息可以清楚地标识一行,但不能明确该行中的确切位置;如果编译器的错误不明确,如果添加换行符并创建更多中间变量,则可以获得更精确的错误位置。

代码语言:javascript
运行
复制
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不是指向结构或联合的指针。未指定的类型不是结构或联合。

C语言中并没有内置polymorphism。它允许通过空指针实现多态,但就像C中的许多事情一样,你需要自己做一些工作。如果只有一个空指针指向对象,C不会跟踪对象的实际类型。你必须指定什么时候你想要取消引用指针,并且你需要正确地去做,否则就是anything can happen

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

代码语言:javascript
运行
复制
struct process *head_process = Head->pData;
runPreemptiveJob(head_process, &start, &end);
int responseTime = getDifferenceInMilliSeconds(head_process->oTimeCreated, start);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58419675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档