为什么我不能改变数组的第二个元素?

Lyr*_*yrk 1 c

int main(void){ 
    char * strPtr="Hello World"; 
    printf("\n%s", strPtr);     
    *(strPtr+2)='Z';
    printf("\n%s", strPtr);     
    getch();
}
Run Code Online (Sandbox Code Playgroud)

我想改变char数组的第二个元素

*(strPtr+2)='Z';
Run Code Online (Sandbox Code Playgroud)

编译器没有给出任何错误,但是当我执行时,代码挂起计算机.哪里出错了?

Ale*_*xis 13

因为当你宣布类似的东西时

char * strPtr="Hello World";
Run Code Online (Sandbox Code Playgroud)

它实际上是一个const char *你不能修改它.

您可以将代码更改为

char * strPtr= strdup("Hello World"); //free it after
Run Code Online (Sandbox Code Playgroud)

要么

char strPtr[30] = {0};
strncpy(strPtr, "Hello World", 11);
Run Code Online (Sandbox Code Playgroud)

并且您的代码将正常运行

  • 在gcc上,你可以尝试-Wwrite-strings标志 (2认同)

unw*_*ind 7

将代码转换为使用实际数组,而不是字符指针:

int main(void){ 
    char strPtr[] = "Hello World"; 
    printf("\n%s", strPtr);     
    *(strPtr+2)='Z';
    printf("\n%s", strPtr);     
    getch();
}
Run Code Online (Sandbox Code Playgroud)

你会没事的 当您在代码中使用初始化字符指针时,字符串数据是"只读",这就是您经常无法修改它的原因.与任何其他数组一样,实际数组不再是真实的.

当然,既然strPtr现在是一个数组,它应该被重命名,并且使用普通索引更好地编写修改,如下所示:

strPtr[2] = 'Z';
Run Code Online (Sandbox Code Playgroud)