在C中修改作为函数参数传递的字符串[duplicate]

zzzyeukh  于 2023-04-29  发布在  其他
关注(0)|答案(3)|浏览(109)

此问题已在此处有答案

How to change value of variable passed as argument?(4个答案)
5年前关闭。
如何修改函数中作为参数传递的字符串的值?
例如,我有这个函数foo(应该将return_string的值从"old string"更改为"new string"):

int foo(char *return_string) {
    char *tmp = "new string";
    return_string = tmp;
    return 0;
}

但是如果我用下面的方式调用它:

char *s = "old string";
foo(s);
printf("%s\n", s);

我仍然得到old string作为输出。为什么?
我承认我对C中的指针和字符串有点混淆。

zi8p0yeb

zi8p0yeb1#

问题
在函数foo()中:

int foo(char *return_string) {
    char *tmp = "new string";
    return_string = tmp;
    return 0;
}

您只是将指针tmp赋值给指针return_string。参数return_string通过值传递给foo()(i.即:它是调用者传递的内容的副本)。return_string所指向的内容(可能是您想要的内容)和传递的指针都没有被修改。

strcpy()

请考虑使用strcpy()

int foo(char *return_string) {
    char *tmp = "new string";
    strcpy(return_string, tmp);
    return 0;
}

这将修改return_string所指向的字符串的内容。

引用传递指针

通过引用传递指针,可以修改指向字符串的指针:

int foo(char **return_string) {
    char *tmp = "new string";
    *return_string = tmp;
    return 0;
}
2ul0zpep

2ul0zpep2#

您正在按值传递指针。需要通过引用传递指针。
更改函数接口以传递char** return_string而不是char* return_string。然后执行*return_string = tmp;

omjgkv6w

omjgkv6w3#

如果您的字符串是动态分配的,则可以按如下方式实现

int foo(char **return_string) {
    if (*return string) free(*return_string)
    *return_string = strdup("new string");
    return 0;
}

char* s = strdup("original");
foo(&s);
....

相关问题