为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;