将cstring作为参数传递,以便可以覆盖它

时间:2013-11-01 22:29:15

标签: c pointers cstring

我想将一个cstring传递给一个函数并将其覆盖。

#include <stdio.h>

void changeStr(char* str1)
{
    str1 = "foo";
}

int main()
{
    char* aStr = "abc123";
    printf("%s\n", aStr);
    changeStr(aStr);
    printf("%s\n", aStr);//aStr is still the same :(
    return 0;
}

我尝试在aStr前加&并在str1前放*,但程序崩溃了。为什么这不起作用?以下是不同的推理as here

2 个答案:

答案 0 :(得分:2)

你可以这样做:

#include <stdio.h>

void changeStr(const char** str1)
{
    *str1 = "foo";
}

int main()
{
    const char* aStr = "abc123";
    printf("%s\n", aStr);
    changeStr(&aStr);
    printf("%s\n", aStr);//aStr is still the same :(
    return 0;
}

这里:

void changeStr(char* str1) {
    str1 = "foo";
}

str1是一个复制值,其中包含"abc123"的地址,因此对其进行任何更改,它都将在函数的范围内。你需要的是修改指针本身的值,地址的持有者,所以它指向"foo",这就是你需要传递char **指针的指针。

答案 1 :(得分:2)

您需要使用指向指针的指针:

void changeStr(char** str1)
{
    *str1 = "foo";
}

int main()
{
    ...
    changeStr(&aStr);
    ...
}

在原始版本中,指针按值传递。当您将其更改为指向其他字符串时,更改不会传播回调用方。