1

次のコードが次の出力を生成するのはなぜですか?

私のコードをこれに更新する:私は基本的に同じことをします。

#ifdef _WIN32
    #include <windows.h>
    #include <direct.h>
    #define GetCurrentDir _getcwd
#else
    #include <unistd.h>
    #define GetCurrentDir getcwd
#endif

//==============================MAIN=======================================
#ifdef _WIN32   
    int main(int argc, char **argv) 
    {
        char *path = (char*)malloc(sizeof(char)*FILENAME_MAX);
        GetCurrentDir(path, sizeof(path));
        printf("path: %s\n", path);
        //other stuff
    }

//==============================END========================================

出力 パス: -

4

3 に答える 3

6

current_dirはスタック変数であり、リターン時に破壊されています。それを宣言するか、パラメーターとしてバッファーをstatic受け入れます。char

于 2011-09-14T23:48:53.687 に答える
3

で宣言されたローカル変数へのポインターを返していますget_current_path。つまり、関数が戻るとクリーンアップされる可能性が高い変数です。バッファを引数として受け入れ、呼び出し元のためにそれを埋める必要があります。つまり、

void char* get_current_path(char* outDir)

あなたの編集ごとに:

int main(int argc, char **argv) 
{
    char *path = (char*)malloc(sizeof(char)*FILENAME_MAX);
    GetCurrentDir(path, sizeof(path));
    printf("path: %s\n", path);
    //other stuff
}

sizeof(path)配列ではなく単なるポインターであるため、4 または 8 (32 ビットまたは 64 ビット) になります。実際のサイズを渡す必要がありsizeof(char) * FILENAME_MAXます。

int main(int argc, char **argv) 
{
    size_t bufSize = sizeof(char) * FILENAME_MAX;
    char *path = (char*)malloc(bufSize);
    GetCurrentDir(path, bufSize);
    printf("path: %s\n", path);
    //other stuff
}
于 2011-09-14T23:51:51.193 に答える
2

current_dirはローカルでget_current_path()あるため、関数が返されるとスタックからポップされ、ランタイムはそれらのスタックの場所に必要なものを自由に貼り付けることができます。そのため、printfプリントがぼやけています。

問題を解決するには、次のいずれかを実行します

  • 配列を次のように宣言しますstatic
  • 配列宣言をファイルスコープに移動し(配列にもしますstaticmain()、配列を直接参照できます。ポインターを戻す必要はありません
  • malloc関数内でバッファを割り当て、get_current_path()割り当てられたバッファ ポインタを返すために使用します。これを行う場合は、free使い終わったら割り当てられたメモリを忘れないでください。
  • @JonathanPatschke が彼の回答で述べているようget_current_path()に、配列へのポインターを受け入れるように変更することもできますstatic
于 2011-09-14T23:49:15.090 に答える