1

我有一个返回 a 的 ac 方法,const char *我将此函数导入到我的 specman 代码中。在“e”中执行更多语句后,字符串中的值被破坏。我猜可能是因为它指的是 C 空间中的指针。

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

在 e 用法中:

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.

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

4

2 回答 2

2

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

于 2016-10-19T07:36:27.493 回答
1

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

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

于 2016-10-23T09:08:18.733 回答