Результат функции "мусор" при получении текущей директории? - PullRequest
1 голос
/ 15 сентября 2011

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

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

Ответы [ 3 ]

6 голосов
/ 15 сентября 2011

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

3 голосов
/ 15 сентября 2011

Вы возвращаете указатель на локальную переменную, объявленную в 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
}
2 голосов
/ 15 сентября 2011

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

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

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