2011-09-14 24 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======================================== 

輸出 路徑: -

+0

很難說,因爲你還沒有發佈你的**實際**代碼。你有沒有嘗試在調試器中加入? –

+0

這是我的實際代碼,複製粘貼出我的程序。 – Newbie

+0

好吧,我看到你現在已經添加了'printf'語句... –

回答

2

您正在返回一個指向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 
} 
6

current_dir是一個堆棧變量,並在返回時得到重挫。要麼聲明它爲static,要麼接受一個char緩衝區作爲參數。

+0

+1,我太慢了。 –

2

current_dir對於get_current_path()是本地的,所以當函數返回時,它會彈出堆棧,並且運行時可以自由地將任何想要的東西粘貼到這些堆棧位置。這就是爲什麼printf打印亂碼的原因。

要解決該問題,請執行下列

  • 一個聲明數組爲static
  • 移動數組聲明爲文件範圍(我也想使它成爲一個static陣列),然後main()可以參考直接向陣列傳遞,不需要傳回指針
  • 使用mallocget_current_path()函數內分配緩衝區並返回分配的緩衝區指針。如果您這樣做,一旦完成使用,請不要忘記free分配的內存。
  • as @JonathanPatschke在他的回答中說,你也可以改變get_current_path()來接受一個指向數組的指針,那麼你不需要使它變成static