0

我想将一个 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;
}

我尝试将 a&放在 aStr 和*str1 前面,但随后程序崩溃。为什么这不起作用?下面的推理不是和这里一样

4

2 回答 2

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 **, 指针传递给指针的原因。

于 2013-11-01T22:32:27.030 回答
2

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

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

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

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

于 2013-11-01T22:32:37.033 回答