2011-09-14 10 views
0

次のコードは、なぜ次の出力を生成しますか?現在のディレクトリを取得すると、関数の結果は "ガベージ"ですか?

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

#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======================================== 

OUTPUT パス: -

+0

**実際の**コードを投稿していないため、言うことは難しいです。あなたはデバッガでステップアップを試みましたか? –

+0

これは私の実際のコードで、私のプログラムの中に貼り付けられたコピーです。 – Newbie

+0

これで 'printf'文が追加されました。 –

答えて

2

get_current_pathで宣言されたローカル変数へのポインタを返します。つまり、関数が返されたときにクリーンアップされる可能性が高い変数です。あなたは、つまり、あなたのEDIT PER

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 
} 
6

current_dirは、スタック変数であり、復帰時に上書きされるばかり。それをstaticと宣言するか、パラメータとしてcharバッファを受け入れます。

+0

+1、私は遅すぎました。 –

2

current_dirget_current_path()にローカルなので、関数が返ってくるとスタックからポップされ、実行時にはそれらのスタックの場所に自由にスティックすることができます。だからこそprintfがぎこちなく印刷されます。

次の操作を行います

  • のいずれかを問題を解決するには、(私もそれstatic配列作ると思います)スコープを提出するstatic
  • 移動配列宣言として配列を宣言してからmain()はを参照することができますポインタを直接渡す必要はありません
  • mallocを使用して、get_current_path()関数内にバッファを割り当て、割り当てられたバッファポインタを返します。これを行う場合は、使用を終了したら、割り当てられたメモリをfreeに忘れないようにしてください。
  • @ JonathanPatschkeが答えたところでは、get_current_path()を変更して配列へのポインタを受け入れることができるので、staticにする必要はありません。
関連する問題