“无效类型的使用无效”错误

时间:2015-11-18 01:23:58

标签: c

这是我得到的两个错误,有人可以向我解释为什么我的想法是错的吗?

HW3.c: In function ‘newStack’:
HW3.c:23:3: error: invalid use of undefined type ‘struct stack’
   myStack.list = malloc(sizeof(job) * 16);

HW3.c:24:3: error: invalid use of undefined type ‘struct stack’
   &job1 = myStack.list;

我做的原因

&job1 = myStack.list; 

是因为我认为这与myStack.list = &job1相同,当我想添加更多工作时,我可以编写像

这样的代码
&job2 = myStack.list + sizeof(job);

至于第一个错误,我只是感到茫然。

typedef struct {
    int phaseAndDuration[2][16];
    int currentPhase;
    int isCompleted;
} job;

typedef struct {
    struct job* list;
    int currentIndex;
    int size;
} stack;

struct stack myStack;
struct job job1;

void newStack(void)
{
    myStack.list = malloc(sizeof(job) * 16);
    &job1 = myStack.list;
    myStack.currentIndex = 0;
}

void pop(void)
{
}

void push(void)
{
    if(myStack.size != 0)
    {
    }
}

int main(void)
{
    return 0;
}

3 个答案:

答案 0 :(得分:1)

错误的原因是您typedef匿名struct并尝试将其声明为匿名或typedef,您需要将声明更改为

stack myStack;

因为struct没有名称,所以你只定义了一个名为stack的类型,你可以使用它来声明一个变量,如果它是

typedef struct stack 
{
    /* ... */
} stack;

您可以同时使用这两者,如果没有typedef,您将只能使用struct stack

另外,表达式

&job1 = myStack.list;

无效,因为&job1不是l值而您无法分配它。事实上,如果它是编译它将意味着一些不可能覆盖堆栈变量的地址。

答案 1 :(得分:1)

如果您使用typedef,请执行以下操作:

typedef struct {

    // (your fields here)

}stack;

然后,在那之后你将你的结构用作stack,就像这样:

stack myStack;

...因为已定义 stack等同于struct {...。它有意义吗?

或者,如果您想继续使用struct,则可以使用结构化标记而非匿名,例如:

struct t_Stack {

    // (your fields here)

};

struct t_Stack myStack;

答案 2 :(得分:0)

您有两种类型stackjob通过typedef定义,而不是struct stackstruct job

&job1 = myStack.list;

是错误的,因为&job1只是一个指针值,而不是一个变量,编译器不知道存储数据的位置。

不知道“添加更多工作”是什么意思,

&job2 = myStack.list + sizeof(job);

可能不好,因为指针的添加会将指针移动到sizeof(job)之后的myStack.list元素。 也许你想做

job2 = myStack.list + 1;

job2指向myStack.list之后的下一个元素。

试试这个:

#include <stdlib.h> /* add this to use malloc() */

typedef struct {
    int phaseAndDuration[2][16];
    int currentPhase;
    int isCompleted;
} job;

typedef struct {
    job* list;
    int currentIndex;
    int size;
} stack;

stack myStack;
job *job1;

void newStack(void)
{
    myStack.list = malloc(sizeof(job) * 16);
    job1 = myStack.list;
    myStack.currentIndex = 0;
}

void pop(void)
{
}

void push(void)
{
    if(myStack.size != 0)
    {
    }
}

int main(void)
{
    return 0;
}