指向char数组的指针,未处理的异常
pointer to char array, unhandled exception
我是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行,代码将不会出现任何问题。我希望你觉得这篇文章有用。
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- C++ 程序中双链表的未处理异常
- 运算符重载时未处理<<异常
- 实验室中0x6BE20E11 (ucrtbased.dll) 的未处理异常.exe: 0xC0000005:访问冲突读取
- ImageMagick 的未处理异常
- 类数组大小为的未处理异常
- 尝试将构造函数设置为 0 - c++ 的未处理异常
- Dijkstra 中0x001e1078 s_Algorithm.exe的未处理异常:0xC0000005:访问冲突读取位置0xbaadf00d
- 运算符重载未处理异常
- 尝试使用 fread 读取文本文件时发生 'System.AccessViolationException' 类型的未处理异常
- c++中的Guard,在main中未处理异常时不调用析构函数
- 某些内存位置的未处理异常
- 错误 linkedlist .exe 中0x00D0345E处的未处理异常: 0xC0000005:访问违规写入位置0x
- 仅在发布模式下使用 glGenBuffer 的未处理异常 - QT
- 如何分析VS2010在调试模式下捕获的未处理异常
- glDrawArrays上的openGL未处理异常(GL_TRIANGLES,0,model.indicesCount)
- 使用Boost Spirit解析语法的未处理异常
- 解析"%Z" C++ 中将错误作为访问 voilation 的未处理异常给出?
- 为什么在win32计时器回调中引发的未处理异常未被调试器视为未处理异常