对于使用C ++工作的装配专家来说,这是一个理论问题。我经常想要从函数中的局部变量返回一个字符串(char *或wchar *)。如您所知,由于局部变量失去了范围,因此无法完成此操作。这让我很好奇,是否可以从函数中推送存储在这个位置的数据?
让我说明一下:
char *IllegalFunc()
{
char *ret = "Hello World";
return ret; //warning: returning the adress of a local variable
}
//what we are attempting
char *IllegalAndMostlyIllogicalFunc()
{
char *ret = "Hello World";
__asm {
//somehow copy *ret to ESP and return
}
}
char *ARightWayToDoIt()
{
char *ret = new char[12];
strcpy(ret, "Hello World");
return ret;
}
这只是为了好奇,我不会实际使用__asm方法...... 我可能只是声明一个静态char *所以我可以在c#
中导入这样的函数[dllimport(...)]
string IllegalFunc();
[dllimport(...)]
string ARightWayToDoIt(); //memory leak, I would need a FreeLastString() method
答案 0 :(得分:6)
该代码不会泄漏,因为文字字符串是静态分配的。返回本地指针是完全合法的,但不是指向本地的指针。但是,您可以请求托管用户将返回值传递给您编写的自由函数,然后您可以使用malloc-或new。
答案 1 :(得分:4)
由于您使用的是C ++,为什么不返回std :: string?
修改强>
DeadMG指出你从C#导入了这个函数。 C中通常的方法是将字符缓冲区作为参数传递给函数。从我所读到的,这也适用于此。例如,请参阅this previous question。
答案 2 :(得分:3)
作为使用C ++的汇编专家,我可以向您保证,在线汇编代码完全不合适: - )
答案 3 :(得分:1)
我不是专家,但我确实知道序言和结尾代码会弄乱你想做什么。如果你真的这样做(不用说,这是不好的做法),请看看naked。