0

可能重复:
从函数返回“ const char * ”是个好主意吗?
如何在 C++ 中返回 char 数组?

这个回报有什么问题?我正在尝试使用以下函数返回当前路径,但它似乎不正确:

请不要:我需要一个字符返回而不是字符串。

char* getINIfile(void)
{
    char buffer[MAX_PATH];
    GetModuleFileName( NULL, buffer, MAX_PATH );
    string::size_type pos = string( buffer ).find_last_of( "\\/" );
    string path = string( buffer ).substr( 0, pos) + "\\setup.ini";

    char *ini_local= (char*)path.c_str();

    printf(ini_local); // so far output OK!

    return ini_local;
}

main
{
    printf(getINIfile()); // output Not OK! 

    char mybuffer[200];
    GetPrivateProfileStringA( "files","DLL","0",  mybuffer,200, getINIfile());
    printf(mybuffer);

}
4

3 回答 3

4

path 在函数末尾超出范围,并且您在该超出范围的对象中返回了一个内部指针。尝试返回一个 std::string

std::string getINIfile(void)
{
    char buffer[MAX_PATH];
    GetModuleFileName( NULL, buffer, MAX_PATH );
    string::size_type pos = string( buffer ).find_last_of( "\\/" );
    string path = string( buffer ).substr( 0, pos) + "\\setup.ini";

    char *ini_local= (char*)path.c_str();

    printf(ini_local); // so far output OK!

    return path;
}
于 2012-08-06T19:09:48.810 回答
3

当函数退出时,您返回的地址超出范围,因此它不再有效:std::string path是函数的本地getINIFile地址,因此在函数退出后它是无效的,您从中获得的地址也是如此path.c_str()

在这种情况下,您可以std::string从您的函数中返回。如果你以后真的需要一个 C 字符串,你可以使用c_str()then:

std::string getINIfile(void)
{
    //...

    return path;
}


int main()
{
    string path = getINIFile();

    // do something with path.c_str():
    const char *cPath = path.c_str();
}

鉴于您的代码,我想不出任何必须char*返回的原因,但如果是这样,您将需要在堆上分配一个缓冲区:

char *getINIfile(void)
{
    char *buffer[MAX_PATH];
    GetModuleFileName(NULL, buffer, MAX_PATH);
    string::size_type pos = string(buffer).find_last_of( "\\/" );
    string path = string(buffer).substr( 0, pos) + "\\setup.ini";

    char *ini_local = new[path.size()];
    strncpy(ini_local, path.c_str(), path.size());

    printf(ini_local); // so far output OK!

    return ini_local;
}

但这是标准 C 字符串和: 的非常糟糕的组合std::string,仅用于操纵路径并在其他任何地方string传递。char*

仅使用标准 C,替换find_last_ofstrrchr- 注意缺少错误处理:

char *getINIfile(void)
{
    char *buffer = new[MAX_PATH];
    char *pos = NULL;
    char *ini_local = NULL;

    GetModuleFileName(NULL, buffer, MAX_PATH);
    pos = strrchr(buffer, "\\/");
    // check for and handle pos == NULL

    buffer[pos] = '\0';

    strncat(buffer, "\\setup.ini", MAX_PATH - strlen(buffer));

    printf(buffer);

    return buffer;
}
于 2012-08-06T19:08:28.770 回答
1

该函数返回一个指向局部变量的指针,该变量超出范围,留下一个悬空指针。为什么不只返回一个std::string值?

std::string getINIfile() {
   ....
   return path;
}

然后你可以char*在调用方使用字符串的底层:

const std::string s = getINIfile();
const char* c = s.c_str();
于 2012-08-06T19:08:38.573 回答