Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 表达式必须具有指向结构或联合类型的指针?_C_Pointers_Void Pointers - Fatal编程技术网

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元素的定义,就会很清楚。