Результат функции "мусор" при получении текущей директории?
Почему следующий код выдает следующий вывод?
ОБНОВЛЕНИЕ МОЕГО КОДА ЭТОГО: я получаю в основном то же самое.
#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
,