Bison返回字符串的规则中%empty分支应使用什么正确动作?
错误原因说明
你之前的尝试不符合C语言的字符串类型规则:
- 单引号在C中用来包裹单个字符,不存在空字符常量
'',所以第一个写法直接报错 ' '是单字符值,C中会被识别为int类型,直接赋值给char*类型的$$必然触发类型不匹配警告- C语言强制类型转换的语法是
(类型)值,你写的char(' ')语法本身错误,同时就算语法正确,转换后仍然是单字符值,不符合指针类型要求
%empty分支的正确写法
你需要返回的是空字符串常量,C中空字符串用双引号包裹,基础写法如下:
{ $$ = ""; }
如果后续需要修改messages返回的字符串内容,直接返回常量字符串会触发段错误,建议使用堆内存分配空字符串:
{ $$ = strdup(""); }
strdup会自动分配足够的内存存储空字符串并返回可写的指针,后续使用完后记得调用free释放即可,避免内存泄漏。
原有递归规则的优化建议
你当前写的$$ = strcat($1, $3);存在内存越界风险:strcat要求第一个参数指向的内存空间足够容纳两个字符串的总长度,直接拼接两个独立分配的字符串大概率会越界崩溃。建议替换为如下写法:
{ size_t total_len = strlen($1) + strlen($3) + 1; $$ = malloc(total_len); strcpy($$, $1); strcat($$, $3); // 释放原有的两个字符串内存,避免泄漏 free($1); free($3); }
内容的提问来源于stack exchange,提问作者Roger Costello
相关产品推荐
相关产品推荐

