int main(void){
char * strPtr="Hello World";
printf("\n%s", strPtr);
*(strPtr+2)='Z';
printf("\n%s", strPtr);
getch();
}
我想通过
更改char数组的第二个元素*(strPtr+2)='Z';
编译器不会出现任何错误,但是当我执行时,代码会挂起计算机。 错误在哪里?
答案 0 :(得分:13)
因为当你宣布像
这样的东西时char * strPtr="Hello World";
它实际上是const char *
所以你无法修改它。
您可以将代码更改为
char * strPtr= strdup("Hello World"); //free it after
或
char strPtr[30] = {0};
strncpy(strPtr, "Hello World", 11);
并且您的代码将正常工作
答案 1 :(得分:7)
转换代码以使用实际数组,而不是字符指针:
int main(void){
char strPtr[] = "Hello World";
printf("\n%s", strPtr);
*(strPtr+2)='Z';
printf("\n%s", strPtr);
getch();
}
你会没事的。当您在代码中使用初始化字符指针时,字符串数据是“只读”,这就是您经常无法修改它的原因。与任何其他数组一样,实际数组不再是真实的。
当然,由于strPtr
现在是一个数组,因此应该重命名,并且使用普通索引编写修改更好,如下所示:
strPtr[2] = 'Z';
答案 2 :(得分:2)
strPtr指向静态内存地址,因为“Hello World”是二进制文件的一部分。您正在尝试更改“Hello World”字符串,这是不允许的。
你可以做到
char strPtr[30] = {0};
memcpy (str, "hello World",11);
*(strPtr+2)='Z';
答案 3 :(得分: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 !
}
答案 4 :(得分:1)
因为你声明了一个const指针,所以这里没有将内存分配给堆。必须将内存分配给堆,以便您可以修改它们:
char * strPtr="Hello World";
按照Alexis的建议使用malloc
或strdup
这也应该有效:
char strPtr[]= "Hello world";