C++ yacc输出意外的结果
我在YACC文件中有这个规则,并且对于规则的作用有一个单独的C++文件。 但是输出不是预期的,如下面的print语句所示。这是parser.y中的规则:C++ yacc输出意外的结果,c++,c++11,yacc,C++,C++11,Yacc,我在YACC文件中有这个规则,并且对于规则的作用有一个单独的C++文件。 但是输出不是预期的,如下面的print语句所示。这是parser.y中的规则: RecordItem : IdentifierList ':' TypeDenoter { char * result = declareRecordItem ($1 , $3); $$ = result; print
RecordItem : IdentifierList ':' TypeDenoter
{
char * result = declareRecordItem ($1 , $3);
$$ = result;
printf(" >>> inside RecordItem >> : %s\n",result);
}
;
这是main.cpp文件中的函数“declareRecordItem”:
char* declareRecordItem( std::vector<char* >* varList , char* type){
string stm = " ";
string identifier;
for(int i=0 ; i < varList-> size() ; i++)
{
identifier= string((*varList)[i]) ;
symtab[identifier] = string(type);
stm = stm + " " + string(type);
}
char * result = (char*)stm.c_str();
printf(">>> inside declareRecordItem >> : %s\n",result);
return result ;
}
在
declareRecordItem
中,创建类型为std::string
的局部变量stm
,然后返回值:(char*)stm.c_str()
但是,stm
在declareRecordItem
返回后立即停止存在,并且stm.c_str()
返回的指针不再有效。它现在指向的内存很可能已被重用以容纳其他对象
因此,如果您想保留字符串的值,您应该
- 返回
本身,依靠RVO提高效率,或std::string
- 创建并返回动态对象(即
),或new std::string()
- 制作字符串缓冲区的C样式副本(即
)strdup(stm.C_str())
<>混合C和C++字符串处理是混乱的,导致混乱的代码。如果你要使用C++,我建议使用<代码> STD::String *< /Cord>,尽管最终你将使用与C风格字符串相同的手动内存管理机制。对于具有符号表的编译器和其他应用程序,一个很好的折衷方法是尽快将字符串放入符号表(或不可变符号名称的映射),即使是在词法扫描程序中,然后传递对符号(或内部名称)的引用。然后,您可以在编译结束时释放保留字符串的整个存储库。如果我创建一个动态对象,它将是指针类型,即string*stm=new std::string()。但是如何像for loop那样附加到它的内部?
*stm=*stm++++…
或者只需*stm++='++…
最后一个问题。如何将string*转换为char*?如我的回答所示,复制C_str返回的C字符串。是的,strdup可以正常工作。。谢谢,但是如果我需要返回变量,我如何释放它。。我需要在另一个文件中使用它,即char*result=declareRecordItem($1,$3);
>>> inside declareRecordItem >> : i32 i32
>>> inside RecordItem >> :