从本地指针复制数据以获取返回值

时间:2011-01-07 20:17:35

标签: c++ string pointers assembly

对于使用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

4 个答案:

答案 0 :(得分:6)

该代码不会泄漏,因为文字字符串是静态分配的。返回本地指针是完全合法的,但不是指向本地的指针。但是,您可以请求托管用户将返回值传递给您编写的自由函数,然后您可以使用malloc-或new。

答案 1 :(得分:4)

由于您使用的是C ++,为什么不返回std :: string?

修改

DeadMG指出你从C#导入了这个函数。 C中通常的方法是将字符缓冲区作为参数传递给函数。从我所读到的,这也适用于此。例如,请参阅this previous question

答案 2 :(得分:3)

作为使用C ++的汇编专家,我可以向您保证,在线汇编代码完全不合适: - )

答案 3 :(得分:1)

我不是专家,但我确实知道序言和结尾代码会弄乱你想做什么。如果你真的这样做(不用说,这是不好的做法),请看看naked