代码之家  ›  专栏  ›  技术社区  ›  Shehzaad

为什么它显示我的函数在返回char*时返回int?

  •  0
  • Shehzaad  · 技术社区  · 11 年前

    yacc代码:

        %{
                #include<stdio.h>
            #include<string.h>
    
    
    
        %}
    
        %union {
                        char* dval;
    
                }
    
        %token <dval> NUM VAR
        %type <dval> E P
        %left '+' '-'
        %left '*' '/'
    
        %%
        statement : P {printf("\nt = %s\n \n",$1);}
                  ;
        P: E
           ;
    
        E : E '+' E {strcpy($$,gencode($1,"+",$3));}
          | E '-' E {strcpy($$,gencode($1,"-",$3));}
          | E '*' E {strcpy($$,gencode($1,"*",$3));}
          | E '/' E {strcpy($$,gencode($1,"/",$3));}
          | '(' E ')' {strcpy($$,$2);}
          | NUM {strcpy($$,$1);}
          | VAR {strcpy($$,$1);}
          ;
        %%
    
    **The lex code:**
    
    
       %{
                #include<stdio.h>
            #include<stdlib.h>
            #include<string.h>
                #include"y.tab.h"
            int n=0;
            char *ch="t";
    
    
        %}
        %%
        [0-9]+ {strcpy(yylval.dval,yytext); return NUM;}
        [a-z]+ {strcpy(yylval.dval,yytext); return VAR;}
        \n {return 0;}
        . {return yytext[0];}
        %%
        void yyerror(char* str)
        {
                printf("\n%s",str);
        }
    
        char* gencode(char *first,char *op,char *second)
        {
            char  *t;
            char x[5];
            t=(char*) malloc(sizeof(char)*5);
    
            strcpy(t, ch);
            itoa(n, x);
            strcat(t, x);        
            printf("\n%s = %s %s %s\n",t,first,op,second);
            n++;
            t[strlen(t)]='\0';
    
            return t;
        }
    
        main()
        {
                yyparse();
                return 0;
        }
    

    出于某种原因,gcc输出错误:warning:传递strcpy的参数2会使指针从整数变为不带强制转换的指针[默认情况下启用]。 其中,strcpy的第二个参数是函数gencode,它返回char*而不是整数。

    2 回复  |  直到 11 年前
        1
  •  0
  •   rici    11 年前

    你需要申报 gencode 在yacc文件的开头。否则,编译器会将其视为未定义,并假定它返回 int .

        2
  •  0
  •   Chris Dodd    11 年前

    你需要申报 gencode 在.y文件中,或者在头文件中 #include 或者直接在.y文件中。

    你有一个更大的问题,你宣布 dval (用于大多数规则的类型)作为 char * ,但在使用写入之前,您永远不会将其初始化为任何内容 strcpy ,所以当strcpy试图写入随机地址时,您的代码会崩溃(甚至更糟)。您可以通过更换 拷贝字符串 使用在lex文件中调用 yylval.dval = strdup(yytext) 以及yacc文件中只分配给的调用 $$ (所以 $$ = gencode( …或其他)