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

pointer to char array, unhandled exception

本文关键字:未处理 异常 指针 数组 指向 char      更新时间:2023-10-16

我是C++的新手,我正在玩指针。我不明白为什么这段代码对我不起作用。你能告诉我它出了什么问题吗?

char * name = "dharman";
char *ptr = name+3;
*ptr = 'a';
printf("%s", name);

我总是遇到未处理的异常。

这本身就是一个错误:

char * name = "dharman";

字符串在常量内存中,但指针的类型指示它可以修改。试图修改它会产生未定义的行为:在其他平台上,程序可以工作,但你运气不好。

这是C++03中的一个怪癖;较新的C++11规范使其成为非法的。之所以这样做,是因为C的兼容性。

无论你是用C++还是纯C编写,解决方案都很简单:

char name[] = "dharman";

现在编译器将数据存储在读写内存中,因为您要求的是char的数组,而不是指向其他内存的指针。

字符串文字,如"dharman",是只读的,您不能修改它们。相反,创建并初始化一个非只读数组。

char name[] = "dharman";

name是指向位于只读内存中的字符串文字"dharman"的指针
在语句*ptr = 'a'中,您正试图修改此字符串文字,这将导致Undefined Behavior

它不起作用,因为"dharman"是常量,它是字符串文字。你不能改变它!

字符串文字通常放在只读内存段中。

您正试图修改一个常量字符串。你需要先把常量复制到你自己的内存中。试试这个:

char *name = (char*) malloc(10);
memcpy(name, "dharman", strlen("dharman"));
...

您将name设置为指向const字符串,然后尝试修改它。将字符串复制到可修改的位置:

char *name = (char*) malloc(strlen("dharman") + 1);
memcpy("dharman", name, strlen("dharman") + 1);

您的案例中未处理异常的原因是。在您的代码中

char *ptr= name+3;

考虑name的基地址,例如:23300,所以char*ptr=name+3将等于23300+(3*sizeof(char))。因此,现在ptr指向23300+(3*1)=23303。每个元素都占用一个bye作为char,因此ptr将指向"dharman"中的字母"a"。由于"dharmann"是char const,您无法获取其值,因此会出现错误。如果删除*ptr=3行,代码将不会出现任何问题。我希望你觉得这篇文章有用。