指向char数组的指针,未处理的异常

时间:2013-11-20 12:04:58

标签: c++ pointers char

我是C ++的新手,我正在玩指针。我无法弄清楚为什么这段代码对我不起作用。你能告诉我它有什么问题吗?

char * name = "dharman";
char *ptr = name+3;
*ptr = 'a';

printf("%s", name);

我一直都处理未处理的异常。

7 个答案:

答案 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.代码将工作没有任何问题。我希望你发现这篇文章有用。