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

パスは関数の最後でスコープ外になり、スコープ外のオブジェクトで内部ポインターを返しています。代わりに 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()

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_ofますstrrchr- エラー処理がないことに注意してください。

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 に答える