为C中的结构类型分配内存
我在我的程序中遇到了一个问题,我定义了一个结构类型,但在标题中没有定义结构变量为C中的结构类型分配内存,c,struct,typedef,C,Struct,Typedef,我在我的程序中遇到了一个问题,我定义了一个结构类型,但在标题中没有定义结构变量 typedef struct { int a; int b; int c; Token d; } Foo; 然后,我想在以后的.c文件中使用这个结构foo,该文件将中缀转换为后缀 #include "header" #include <stdio.h> #include <string.h> #include <stdarg.
typedef struct
{
int a;
int b;
int c;
Token d;
} Foo;
然后,我想在以后的.c文件中使用这个结构foo
,该文件将中缀转换为后缀
#include "header"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
int infix2postfix(char *infix, Arr arr)
{
struct Foo foo;
char szToken[MAX_TOKEN];
Stack stack = newStack();
infix = getToken(infix, szToken, MAX_TOKEN); //provides next token to be scanned by function.
... //push pop using switch case didn't post code for simplicity.
case...
push(stack, *foo.a);
...
case...
pop(stack);
...
goOut(arr, *foo.d); //goOut(function that populates and "arr" Array from printing.
}
我试过
structfoo*Foo=malloc(sizeoffoo)
分配内存,但它会弄乱我的推送(stack,*foo.a)代码>和gout(arr,*foo.d)代码>如何着手修复此问题?是否必须先在infix2postfix
函数中分配内存,然后声明结构变量 您已经将Foo定义为typedef结构,因此不再使用struct Foo来声明Foo,只需使用
富富,;声明不是struct Foo Foo 您定义了一个类型Foo
,它是一个无标记的struct
类型。您可以有一个单独的struct Foo{int anonymous;char name[MAX_name];}
与类型Foo
完全无关。(这对人类来说会非常混乱,但编译器不会有问题。)
在函数中,您应该编写:
int infix2postfix(char *infix, Arr arr)
{
Foo foo;
您必须将其键入Foo
。所以它需要Foo-Foo代码>。也就是说,没有struct
。是的,typedef将其定义为Foo,因此当尝试分配内存时,它应该是Foo*Foo=malloc(sizeof Foo)代码>@艾伦·奥诺。应该是:Foo*Foo=malloc(sizeof*Foo)代码>或Foo*Foo=malloc(sizeof Foo)代码>。我更喜欢前者,因为如果类型改变,它需要更少的维护代码>和gout(arr,*foo.d)代码>函数不工作:(弄乱了我的指针。是的,我这样做了,现在把我的推送(stack,*foo.a);
和gout(arr,*foo.d);
弄乱了指针。因为*元素不是结构:(.要么将foo声明为指向foo.foo*foo的指针;要么在推送(stack,foo->)中,要么将foo声明为结构foo;然后推送(stack,foo.a)我的函数中有这个,因为我需要一个foo变量,但它与push()和goOut()中的第二个参数冲突。编译器对push和goOut()分别使用“invalid uinary*(have int)”和“expected foo,但参数类型为char”;例如,您需要只编写foo.a
。变量foo
是一个结构,它的一个元素是由foo.a
标识的int
,您可以将间接运算符*
计数为普通的int
。如果您有一个适当初始化的指针,foo*bar=…;
,你可以写(*bar)。a
,或者更自然地说,bar->a
。可能是因为我的代码不好。我也试过了,并且在推送(stack,foo.a);
和Goot(out,foo.d)中都试过了使用Foo-Foo;
声明,我得到预期的'Foo'作为参数2,但参数的类型分别为int
和*char
。因此,在某个地方我设法弄乱了参数的语法。
int infix2postfix(char *infix, Arr arr)
{
Foo foo;