char * str = "Hello";
*(str+1) = '3';
cout<<str;
我试图做的是将第二个角色改为'3',将其变成H3llo
为什么不起作用?
答案 0 :(得分:3)
这是未定义的行为。你无法改变文字。
要有一个指向文字的指针,它应该是:
const char* str = "Hello";
//^^^^^
然后,为了能够改变字符串,这应该是,例如
char str[] = "Hello";
另一种选择是动态分配内存(使用malloc
和free
)
答案 1 :(得分:2)
字符串文字在只读内存中分配。所以基本上它们是类型(const char *
)。它不能被更改。
有关详细信息,另请参阅this。
答案 2 :(得分:1)
因为str的类型为“const char *”,所以不允许覆盖它所指向的对象。
答案 3 :(得分:0)
#include <string.h>
char *str;
if((str = malloc(strlen("hello"))) != NULL)
return (null);
str = strcpy(str, "hello");
printf("%s\n", str); // should print hello
str[2] = '3';
printf("%s\n", str) // should print he3lo
这里的事情是我在之前分配内存以在字符串中设置char。 但是如果你对分配不好,你可以随时设置char str [] =“hello”;
答案 4 :(得分:0)
str
的内存将在.rodata
部分中分配。所以试图修改只读数据会产生问题。
以下问题给出了问题。
#include <stdio.h>
int main()
{
char * str = "Hello";
printf("\n%s \n", str);
*(str+1) = '3';
printf("\n%s \n", str);
return 0;
}
相应的拆卸
.file "dfd.c"
.section .rodata
.LC0:
.string "Hello"
.LC1:
.string "\n%s \n"
.text
.....
.....
结果是
Hello
Segmentation fault (core dumped)
我在X86_64上使用gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)。
答案 5 :(得分:0)
str是指向字符串常量的指针,字符串的内存在只读部分中分配。如果您尝试修改字符串内容,则结果未定义。但是,与数组名相比,您可以将指针修改为指向其他内容,该数组名始终绑定到相同的内存位置。