Error : Expected expression before 'DATA /* : typedef struct DATA DATA */

Error : Expected expression before 'DATA /* : typedef struct DATA DATA */

我不知道我的代码有什么问题。我读了一些有同样问题的人的问题,但我没有找到答案。 当我尝试编译时出现此错误:

||In function 'main':|

|35|error: expected expression before 'DATA'|

||In function 'lecture_data':|

|59|error: expected expression before 'DATA'|

||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

我也想知道我应该做什么,如果还有其他问题,我不应该在这段代码中做什么。

代码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    #define V 20

    /* Structure */

    typedef struct DATA{
        char* NomP;
        char* NomA;
        int iNbr;
        int iPix;
        struct DATA *Next;
    }DATA;

    /* --------- */

    void* MALLOC(size_t nombre);
    int lecture_data(FILE *fs,DATA* Data,DATA* ROOT);
    void print_data(DATA* data,int len);

    int main(void)
    {
        char FileName[V];
        puts("Data file ? : ");
        gets(FileName);

        FILE* fs = fopen(FileName,"r");
        if( fs == NULL )
        {
            perror("Error ");
            exit(EXIT_FAILURE);
        }

        DATA *HEAD = MALLOC(sizeof DATA);
        DATA *D_Store;
        int len = lecture_data(fs,D_Store,HEAD);
        print_data(D_Store,len);
        return 0;
    }

    int lecture_data(FILE *fs,DATA *Data,DATA *ROOT)
    {
        char cNom[V],cArticle[V];
        int iNombre,iPrix;
        int eofs=0;int i=0;

        while(!eofs)
        {
            fscanf(fs,"%s %s %d %d",cNom,cArticle,&iNombre,&iPrix);
            Data->iNbr=iNombre;
            Data->iPix=iPrix;
            Data->NomA = MALLOC(strlen(cArticle)+1);
            Data->NomP = MALLOC(strlen(cNom)+1);
            strcpy(Data->NomA,cArticle);
            strcpy(Data->NomP,cNom);
            if( i==0 )
            {
                Data -> Next = MALLOC(sizeof DATA);
                ROOT = Data ;
            }
            DATA *Ptr = ROOT ;
            while( Ptr -> Next != NULL )
            {
                Ptr = ROOT -> Next;
            }
            Data -> Next = NULL ;
            Ptr -> Next = Data ;

            fprintf(stdout,"Data : N.%d: %s %s %d$\n",i,cNom,cArticle,iNombre*iPrix);
            i++;
            eofs = feof(fs) ;

            if(ferror(fs))
            {
                perror("Error ");
                exit(EXIT_FAILURE);
            }
        }
        fclose(fs);
        return i;
    }

    void* MALLOC(size_t nombre)
    {
        void *MEMEORY = malloc(nombre);
        if(NULL == MEMEORY )
        {
            perror("Error ");
            exit(EXIT_FAILURE);
        }
        return MEMEORY;
    }

改变

DATA *HEAD = MALLOC(sizeof DATA);

DATA *HEAD = MALLOC(sizeof (DATA));

sizeof 运算符的类型名称操作数必须用括号括起来。

使用

DATA *HEAD = MALLOC( sizeof( DATA ) );

而不是

DATA *HEAD = MALLOC(sizeof DATA);

sizeof运算符定义如下

sizeof unary-expression
sizeof ( type-name )

如您所见,类型名称应括在括号中。

来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)

2 The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type.

请注意,如果 e 是一个表达式,那么 ( e ) 也是一个表达式。因此,对于表达式,您可以写成

sizeof e

sizeof( e )

而变量的标识符也构成了一个表达式。