2015-09-18 4 views
0

У меня есть проблема в моей программе, где я определяю тип структуры, но не структурную переменную в заголовке как таковой.Выделение памяти для типов структуры в C

typedef struct 
{  
    int a;  
    int b; 
    int c; 
    Token d; 
} Foo; 

Затем я хочу использовать эту структуру foo позже в .c файле, который делает инфикс к суффиксом

#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. 

} 

Так что, когда я компилирую здесь я получаю

error: storage size of ‘foo’ isn’t known struct Foo foo; 

У меня есть попробовал struct Foo *foo = malloc(sizeof foo); выделить память, но она испортила мои push(stack, *foo.a); и goOut(arr, *foo.d); Как мне это исправить? Нужно ли мне сначала выделить память в функции infix2postfix, а затем объявить структурную переменную?

+2

У вас есть ЬурейеЕ в 'Foo'. Так что это должно быть 'Foo foo;'. То есть, нет 'struct'. – kaylum

+0

yep typedef it to Foo –

+0

Поэтому, пытаясь выделить память, это должно быть 'Foo * foo = malloc (sizeof foo);'? @Alan Au – jdanzi

ответ

1

Вы определили тип Foo, который является безличным типом struct. У вас может быть отдельный struct Foo { int anonymous; char name[MAX_NAME]; };, который полностью не связан с типом Foo. (. Было бы очень запутанным для людей, но компилятор не будет никаких проблем)

В функции, вы должны написать:

int infix2postfix(char *infix, Arr arr) 
{ 
    Foo foo; 
+0

У меня это было в моей функции, так как мне нужна переменная foo, но она конфликтует со вторым аргументом как в push(); и goOut() ;. Компилятор ссылается на недействительный uinary * (есть int) для push и 'expected Foo, но аргумент - type char для goOut(); – jdanzi

+0

Вам нужно было бы написать только 'foo.a', например. Переменная 'foo' является структурой, а один из ее элементов -' int ', идентифицированный 'foo.a', и вы можете сделать оператор косвенности' * 'равным« int ». Если у вас есть правильно инициализированный указатель, 'Foo * bar = ...;', вы можете написать '(* bar) .a', или, более естественно,' bar-> a'. –

+0

Возможно, мой код просто плох. Я также пробовал это и в обоих случаях: push (stack, foo.a); 'и' goOut (out, foo.d); 'с декларацией' Foo foo; 'и я получаю' ожидаемый 'Foo' как аргумент 2, но аргумент имеет тип int' и '* char' соответственно. Поэтому где-то мне удалось испортить синтаксис аргументов. – jdanzi

1

Вы уже определили Foo как структуру typedef, так что вы еще не используете struct Foo для объявления foo, просто используйте Foo foo; объявить не struct Foo foo;

+0

Да, я сделал это сейчас, , * foo.a); 'и' goOut (arr, * foo.d); 'перепутали указатели, так как * element isnt structre :( – jdanzi

+0

либо объявить foo как указатель на Foo. Foo * foo; затем в режиме push (stack, foo-> a) или объявить foo как структуру Foo foo; then push (stack, foo.a) – LapelCard

Смежные вопросы