c 字符串到 specman e 代码

c string to specman e code

我有一个 returns 一个 const char * 的 c 方法,我将这个函数导入到我的 specman 代码中。在 "e" 中执行更多语句后,字符串中的值已损坏。我猜可能是因为它指的是 C space.

中的指针

C签名:

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

在电子:

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 不是一个好主意,因为这样的字符串不会被 Specman 的内存管理机制(如垃圾回收)正确处理,即使没有通过C 代码本身。

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