我是C ++的新手,我正在玩指针。我无法弄清楚为什么这段代码对我不起作用。你能告诉我它有什么问题吗?
char * name = "dharman";
char *ptr = name+3;
*ptr = 'a';
printf("%s", name);
我一直都处理未处理的异常。
答案 0 :(得分:2)
仅这是一个错误:
char * name = "dharman";
字符串在常量内存中,但指针的类型表示可以修改它。试图修改它会产生不确定的行为:在其他平台上,程序会运行,但你运气不好。
这是C ++ 03中的一个怪癖;较新的C ++ 11规范使其成为非法。它的原因是C兼容性。
无论您是用C ++还是纯C编写,解决方案都很简单:
char name[] = "dharman";
现在编译器将数据存储在读写内存中,因为你要求的数组为char
,而不是指向其他内存的指针。
答案 1 :(得分:1)
字符串文字(如"dharman"
)是只读的,您无法修改它们。相反,创建并初始化不是只读的数组。
char name[] = "dharman";
答案 2 :(得分:1)
name
是指向字符串文字"dharman"
的指针,它位于只读存储器中。
在您的语句*ptr = 'a'
中,您正在尝试修改此字符串文字,从而导致Undefined Behavior
答案 3 :(得分:0)
它不起作用,因为"dharman"
是常量,它是一个字符串文字。你无法改变它!
字符串文字通常放在内存的只读段中。
答案 4 :(得分:0)
您正在尝试修改常量字符串。 您需要先将常量复制到您拥有的某个内存中。 试试这个:
char *name = (char*) malloc(10);
memcpy(name, "dharman", strlen("dharman"));
...
答案 5 :(得分:0)
您要将name
设置为指向const
字符串,然后尝试修改它。将字符串复制到可修改的位置:
char *name = (char*) malloc(strlen("dharman") + 1);
memcpy("dharman", name, strlen("dharman") + 1);
答案 6 :(得分:-1)
您案件中未处理的异常的原因是。在您的代码中
char *ptr= name+3;
将名称的基地址视为例如:23300,因此char * ptr = name + 3将等于 23300+(3 * sizeof(char))。所以现在ptr指向23300+(3 * 1)= 23303.each元素占用char的一个再见,所以ptr将指向“dharman”中的字母'a'.since“dharman “是char const你不能它的价值,这就是为什么你得到错误。如果你删除行* ptr = 3.代码将工作没有任何问题。我希望你发现这篇文章有用。