gpt4 book ai didi

c - Bison token 值被覆盖 - C 内存问题?

转载 作者:行者123 更新时间:2023-11-30 15:58:01 25 4
gpt4 key购买 nike

好的,我在 Bison .l 文件中有以下代码。顺便说一下,我是 c 的新手。

exp: TK_SLIT    // TK_SLIT is a string literal token

/* assigns the type to the nonterminal exp */
$$ ->type = (char *) malloc (strlen ("string") + 1); /* allocates space */
strcpy ($$->type,"string"); /* puts value in there */
printf ("%s\n",$$->type);

printf ("The value of TK_SLIT is - %s\n",$1);

我发现“分配类型”代码块(4 行,包括注释)覆盖了内存中 TK_SLIT ($1) 的值。 TK_SLIT 的值是从我的扫描仪 FLEX 中获取的。

我知道该代码块导致了问题,因为如果我注释掉“分配类型”代码块,那么我的 TK_SLIT token 值就可以正常打印。否则就变成乱码。

我的malloc有问题吗?为什么它会覆盖我的代币值?这是一个 Bison 问题,它没有保护内存中的 token 值吗?

好的,我的 union 如下:

%union
{

int intbison;
char *charbison; // used for input
char *boolbison;
int voidbison;
charlist *charlistbison;
arraylist *arraylistbison;
expnode *expnodebison;
}
<小时/>

这也是我的头文件中的 expnode:

   typedef struct expnode{
char *type;
typesymrec *typesymrecptr;
varsymrec *varsymrecptr;
char *stringval;
int intval;
int boolval;


}expnode;
<小时/>

我将“exp”非终结符设置为“expnodebison”类型。

最佳答案

终于明白了。

问题是 $$ 是 expnode 结构类型,需要对其进行 malloc。

完成此操作后,我的 TK_SLIT $1 token 就被保留了。以下是修复方法

exp: TK_SLIT    // TK_SLIT is a string literal token

$$ = (expnode *) malloc (sizeof (expnode));
$$ ->type = (char *) malloc (strlen ("string") + 1); /* allocates space */
strcpy ($$->type,"string"); /* puts value in there */
printf ("%s\n",$$->type);

printf ("The value of TK_SLIT is - %s\n",$1);


}

关于c - Bison token 值被覆盖 - C 内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10117710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com