0

我有这个 Yacc 代码:

...
%union{
    int counter;
    char* partial_code;
}
....
single_selection_predicate: STRING EQ SINGLE_QUOTATION STRING SINGLE_QUOTATION 
        {   $<counter>$ = 1;
            printf("Counter: %d\n", $<counter>$);
            int size = sizeof(char)*(strlen($<partial_code>1) + strlen($<partial_code>4) + 7);
            $<partial_code>$ = (char*)malloc(size);
            printf("Counter: %d\n", $<counter>$);}
        ;
....

我希望语法规则相关代码块中的第一个和第二个 printf 打印相同的输出。但是,我得到这样的东西:

Counter: 1
Counter: 7402224

也许发生了一些溢出,但我不知道为什么。你可以帮帮我吗?

4

2 回答 2

1

联合不是结构。

在你的 union 中,counter占用partial_code和内存相同的位置。您的写入会partial_code覆盖对 的分配counter

%union{
    int counter;
    char* partial_code;
}
于 2013-10-08T16:48:50.560 回答
1

要扩展查理的答案,您可以轻松地将结构粘贴到联合中:

%union{
    struct {
        int counter;
        char* partial_code;
    } code_and_counter;
    char *partial_code;
}
%token<partial_code> STRING
%type<code_and_counter> single_selection_predicate
%%
single_selection_predicate: STRING EQ SINGLE_QUOTATION STRING SINGLE_QUOTATION 
    {   $$.counter = 1;
        printf("Counter: %d\n", $$.counter);
        int size = strlen($1) + strlen($4) + 7;
        $$.partial_code = malloc(size);
        printf("Counter: %d\n", $$.counter);}
    ;

此外,您应该很少使用该$<tag>X语法——您应该始终声明令牌/非终端的类型,如上所示,并让 yacc 将标签粘贴到您的操作代码中。

此外,永远不要使用sizeof(char)(它总是 1),并且永远不要显式地转换 malloc 的结果。

于 2013-10-08T20:46:19.847 回答