我想将一个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?
答案 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);
...
}
在原始版本中,指针按值传递。当您将其更改为指向其他字符串时,更改不会传播回调用方。