自从我用C ++编程以来已经很长时间了,但我最近写了一些C ++函数并且遇到了一些麻烦。该函数返回一个结构,Result,其中包含一些字符串。我以为我为字符串分配了内存,但jsonResult有时会被部分覆盖。
//The structs
struct Interp {
int score;
char* sentence;
char* jsonResult;
};
struct Result {
int resultCode;
char* errorMessage;
Interp interp;
};
...
//Inside the function
Result result;
//Store decode
const char* jsonResult,* sentence;
if (result.resultCode == -1)
{
LVInterpretation interp = port.GetInterpretation(voiceChannel, 0);
result.interp.score = interp.Score();
sentence = interp.InputSentence();
jsonResult = interp.ResultData().Print(SI_FORMAT_ECMA);
}
//Allocate memory for strings
result.interp.jsonResult = new char[strlen(jsonResult) + 1];
strcpy(result.interp.jsonResult, jsonResult);
result.interp.sentence = new char[strlen(sentence) + 1];
strcpy(result.interp.sentence, sentence);
result.errorMessage = new char[strlen(errorMessage) + 1];
strcpy(result.errorMessage, errorMessage);
return result;
其他信息: 我正在使用ctypes观察我编写的python绑定背后的所有内容。不要认为这确实影响了任何事情。
答案 0 :(得分:4)
使用std::string
。你不会后悔的。
答案 1 :(得分:1)
我会把钱存在你的问题上:
jsonResult = interp.ResultData().Print(SI_FORMAT_ECMA);
谁拥有Print()返回的char *数组?也许它试图返回一个超出范围内存的指针???
示例:
char* badFunction(void)
{
char test[100];
strcpy(test,"This is really clever"); // oh, yeah?
return test; // returns pointer to data that's out of scope
}
另一件事。在声明它们时,为句子,jsonResult等分配空指针。否则你最终可能会strcpy()未初始化的数据,
答案 2 :(得分:0)
一些事情:
“部分覆盖”是什么意思?你怎么会知道这事?即你的预期产量与你所看到的相比是什么?
目前还不清楚result.resultCode
如何设置为-1(或者如果它已经设置),如果设置了,如何在interp.InputSentence()
和{interp.ResultData().Print(SI_FORMAT_ECMA)
中分配内存{1}}?我建议你的问题在那里
只要jsonResult
和sentence
包含有效的以空字符结尾的字符串,其余代码就应该有效。