开发者

C - Not getting the right value with an argument pointer

The get_current_path function gets a pointer to a char string of the current working directory. printf("%s\n", buf); in the function itself prints exactly what I want, but then outs开发者_如何学Cide of the function, printf("%s", thisbuf); gives me a lot of garbage. I assume I've made some silly mistake here, but I can't figure out what it is.

#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;
}


You should pass a pointer to char *

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

int main()
{
    char *thisbuf;
    get_current_path(&thisbuf);
}


Parameters in C are pass-by-value, which means that get_current_path can't change the value of "thisbuf" passed in by the caller.

To make the change, you would have to pass in a pointer to "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"


Try this instead:

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

And:

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

    return 0;
}

You were trying to pass a copy of buf to get_current_path, so when buf was modified, the original pointer to buf was not modified.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜