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

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

*(strPtr+2)='Z';

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

4

5 回答 5

13

因为当你声明类似

char * strPtr="Hello World";

它实际上是一个const char *所以你不能修改它。

您可以将代码更改为

char * strPtr= strdup("Hello World"); //free it after

或者

char strPtr[30] = {0};
strncpy(strPtr, "Hello World", 11);

并且您的代码将正常工作

于 2013-07-02T11:36:07.273 回答
7

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

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

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

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

strPtr[2] = 'Z';
于 2013-07-02T11:39:19.750 回答
2

strPtr 指向静态内存地址,因为“Hello World”是二进制文件的一部分。您正在尝试更改“Hello World”字符串,这是不允许的。

你可以做

char strPtr[30] = {0};
memcpy (str, "hello World",11);
*(strPtr+2)='Z';  
于 2013-07-02T11:37:04.980 回答
2

那是因为strPtr是一个const char *. 如果你需要改变这个数组的一个元素,你应该在堆上分配它,像这样:

int main(void){

    char * strPtr= malloc(sizeof("Hello World") + 1);
    strncpy(strPtr, "Hello World", sizeof("Hello World") + 1);
    printf("\n%s", strPtr);     
    *(strPtr+2)='Z';
    printf("\n%s", strPtr);     
    getch();
    free(strptr); // don't forget to free it !
}
于 2013-07-02T11:38:01.493 回答
1

因为您正在声明一个 const 指针,所以这里的内存没有分配给堆。必须将内存分配给堆,以便您可以修改它们:

char * strPtr="Hello World";

使用mallocstrdup按照亚历克西斯的建议

这也应该有效:

char strPtr[]= "Hello world";
于 2013-07-02T11:39:59.723 回答