这是我得到的两个错误,有人可以向我解释为什么我的想法是错的吗?
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;
}
答案 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)
您有两种类型stack
和job
通过typedef
定义,而不是struct stack
或struct 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;
}