无法更新c中给定char指针的值

Sud*_*tel 1 c string pointers

我正在使用==operator 检查字符串之间的直接比较.当两个字符串都是正确比较的字符指针时.我很快意识到它发生了编译器默认情况下为两个char指针变量分配相同的地址,因为它们保持相同的值.

#include<stdio.h>

void update(char *str2){
 *(str2+2)='O';
}
int main(){

char *str1="Sudhanshu";
char *str2="Sudhanshu";

printf(" %s  , %s ",str1,str2);
update(str2);
printf(" %s  , %s ",str1,str2);

if(str1==str2){
   printf("True\n");
}else
  printf("False\n");

return 0;
}
Run Code Online (Sandbox Code Playgroud)

地址str1str2是一样的.所以我想检查更新一个指针是否实际影响其他指针.

但是,我遇到了分段错误.为什么我会遇到段故障?

use*_*738 7

尝试修改字符串文字是未定义的行为.字符串文字是只读的 - 它是不可修改的.

也不要试图解释未定义的行为.在这里你有segmenattion故障试图访问不可修改的内存.

您可以使用strdup,虽然

char *str1=strdup("Sudhanshu");
char *str2=strdup("Sudhanshu");
Run Code Online (Sandbox Code Playgroud)

这将允许您更改字符串,并且还需要释放strdup使用它时分配的内存.

strdup是一个POSIX的东西 - 如果你没有它,使用malloc strcpy组合来模仿相同的行为.

另外,从评论得到的Bart Friederichs是你可以声明一个数组char并用文字本身初始化它们.

char str1[]="Sudhanshu";
Run Code Online (Sandbox Code Playgroud)

str1是可修改的,在这种情况下你也不需要显式释放内存.


即使您将指针与相同的字符串文字进行比较 - 它们也可能不指向相同的内存位置.这可能会有所不同 因此,您不能确定它们总是会导致两个相同值的比较.这可能会因编译器而异.