C - Не получить правильное значение с указателем аргумента - PullRequest
2 голосов
/ 27 января 2011

Функция get_current_path получает указатель на строку символов текущего рабочего каталога. printf ("% s \ n", buf); в самой функции печатается именно то, что я хочу, но затем вне функции printf ("% s", thisbuf); дает мне много мусора. Я предполагаю, что совершил здесь какую-то глупую ошибку, но не могу понять, что это такое.

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>

int get_current_path(char *buf) {
long cwd_size;
char *ptr;

cwd_size = pathconf(".", _PC_PATH_MAX);


if ((buf = (char *) malloc((size_t) cwd_size)) != NULL)
    ptr = getcwd(buf, (size_t)cwd_size);
else cwd_size == -1;

printf("%s\n", buf);
printf("%ld\n", cwd_size);
return cwd_size;
}


int main (int argc, char **argv) 
{
char *thisbuf;
get_current_path(thisbuf);
printf("%s", thisbuf);

return 0;
}

Ответы [ 3 ]

5 голосов
/ 27 января 2011

Вы должны передать указатель на char *

int get_current_path(char **buf)
{
    *buf = ...;
}

int main()
{
    char *thisbuf;
    get_current_path(&thisbuf);
}
4 голосов
/ 27 января 2011

Параметры в C передаются по значению, что означает, что get_current_path не может изменить значение «thisbuf», переданное вызывающей стороной.

Чтобы внести изменение, вам необходимопередать указатель на thisbuf:

int get_current_path(char **resultBuf) {
    char *buf = (char *) malloc((size_t) cwd_size);
    ...
    *resultBuf = buf;  // changes "thisbuf" in the caller
 }
 ....

get_current_path(&thisbuf); // note - passing pointer to "thisbuf"
4 голосов
/ 27 января 2011

Попробуйте вместо этого:

int get_current_path(char **buf) {
*buf = something; // Set buf with indirection now.

И:

int main (int argc, char **argv) 
{
    char *thisbuf;
    get_current_path(&thisbuf);
    printf("%s", thisbuf);

    return 0;
}

Вы пытались передать копию буфера в get_current_path, поэтому при изменении буфераисходный указатель на buf не был изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...