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
  • 将数组声明移动到文件范围(我也将其设为static数组),然后main()可以直接引用数组,无需返回指针
  • 用于mallocget_current_path()函数内分配缓冲区并返回分配的缓冲区指针。free如果你这样做,一旦你完成使用它,不要忘记分配的内存。
  • 正如@JonathanPatschke 在他的回答中所说,您也可以更改get_current_path()为接受指向数组的指针,然后您不需要 make it static
于 2011-09-14T23:49:15.090 回答