Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ yacc输出意外的结果_C++_C++11_Yacc - Fatal编程技术网

C++ yacc输出意外的结果

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

我在YACC文件中有这个规则,并且对于规则的作用有一个单独的C++文件。 但是输出不是预期的,如下面的print语句所示。这是parser.y中的规则:

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()
返回的指针不再有效。它现在指向的内存很可能已被重用以容纳其他对象

因此,如果您想保留字符串的值,您应该

  • 返回
    std::string
    本身,依靠RVO提高效率,或
  • 创建并返回动态对象(即
    new std::string()
    ),或
  • 制作字符串缓冲区的C样式副本(即
    strdup(stm.C_str())
在后两种情况下,您需要在完成副本后手动释放副本。在第一种情况下,如果需要保留一个C字符串,则仍然需要复制底层C字符串


<>混合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 >>  :