Результат функции "мусор" при получении текущей директории?

Почему следующий код выдает следующий вывод?

ОБНОВЛЕНИЕ МОЕГО КОДА ЭТОГО: я получаю в основном то же самое.

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

Выходной путь: -

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
}

current_dir переменная стека, которая возвращается после возврата. Либо объявить это static или принять char буфер в качестве параметра.

current_dir является локальным для get_current_path() поэтому, когда функция возвращается, она выталкивается из стека, и среда выполнения может свободно вставлять все, что она хочет, в эти места стека. Вот почему printf печатает бред.

Чтобы устранить проблему, выполните одно из следующих действий.

  • объявить массив как static
  • переместить объявление массива в область видимости файла (я бы тоже сделал static массив), а затем main() может ссылаться на массив напрямую, нет необходимости передавать указатель назад
  • использование malloc выделить буфер внутри get_current_path() функция и возвращает выделенный указатель буфера. Если вы делаете это, не забудьте free выделенная память, как только вы закончите, используя ее.
  • как говорит @JonathanPatschke в своем ответе, вы также можете изменить get_current_path() принять указатель на массив, тогда вам не нужно делать это static,
Другие вопросы по тегам