C字符串到样本代码



我有一个返回const char *的c方法,我将这个函数导入到我的样本代码中。在"e"中执行了几条语句后,字符串中的值被破坏了。我猜可能是因为它指的是C空间中的指针。

C签名:

const char* myFun(const char* key)
{
    static string myVal;
    myVal = myDictionary[key];
    return myVal.c_str();
}
在e:

myFun(key : string) : string is foreign dynamic C routine

的用法:

var str : string;
var str2 : string;
str = myFun("my_test");
outf("%s",str)  ---> here it gives the correct value
str2 = myFun("my_test2"); 
----------
----------
outf("%s",str)  ---> here it gives some garbage value, statements in the middle doesn't edit this string in anyway.

关于这段代码有什么问题的想法?

字符串是不可变的,因此没有合法的方法来改变它的内容。我认为你需要看看你的C代码-它可能做一些重用内存的字符串,它发送给e之前的调用。如果指向C字符串的指针被传递给e,并且没有立即在e代码中处理,作为预防措施,可以使用.copy()复制它,例如

一般来说,直接将C字符串传递给e并不是一个好主意,因为即使C代码本身没有重用内存,Specman的内存管理机制(如垃圾收集)也不会正确处理这些字符串。

虽然使用.copy()确实是一种可能的解决方案,但另一种解决方案是在C函数中使用SN_STRING_COPY宏,它复制字符串并使用Specman内存分配机制为新字符串分配内存。但是,只有在编写C函数时考虑到与e的接口,而不是作为不知道e的通用C实用程序时,这才有意义。

最新更新