C++ 字符串分配期间的访问冲突写入位置错误

C++ 字符串分配期间的访问冲突写入位置错误,c++,pointers,C++,Pointers,我收到“访问冲突”错误,但无法确定其根本原因。我是初学C++的,准备初学C++编码竞赛。请帮我找出根本原因。请查找附加的屏幕截图 提前谢谢 这是我在一个.cpp文件中的代码 #include <iostream> using namespace std; void reverse(char *str) { char * end = str; char tmp; if (str) { while (*end) { ++en

我收到“访问冲突”错误,但无法确定其根本原因。我是初学C++的,准备初学C++编码竞赛。请帮我找出根本原因。请查找附加的屏幕截图

提前谢谢

这是我在一个.cpp文件中的代码

#include <iostream>
using namespace std;
void reverse(char *str) {
    char * end = str;
    char tmp;
    if (str) {
        while (*end) {
            ++end;
        }
        --end;
        while (str < end) {
            tmp = *str;
            *str++ = *end; //Getting exception here
            *end-- = tmp;
        }
    }
}

int main ()
{
    char *str="Test";
    cout << "Before change"<<str;     // prints Hello World!
    reverse(str);
    cout << "After change"<<str; // prints I'm a C++ program
    getchar();
}
#包括
使用名称空间std;
无效反向(字符*str){
char*end=str;
char-tmp;
如果(str){
while(*结束){
++结束;
}
--结束;
while(strconst char*

为了使代码运行,可以将文本字符串存储在字符数组中,以便
main()
中的第一行如下所示:

char str[] = "Test";
您将得到一个,因为您正试图编辑存储文本字符串“Test”的只读内存(因为字符串文本在c++中是
const char*

为了使代码运行,可以将文本字符串存储在字符数组中,以便
main()
中的第一行如下所示:

char str[] = "Test";

问题是C++中默认的字符串常量类型是conchchar *./p>

char *str="Test";

在下一行中,将非常量字符*分配给常量字符*

char *str="Test";

这样,当你把这个变量传递给反向函数时,你就尝试写只读内存。这违反了C++的规则,导致了意外的行为。 按如下方式定义字符串以解决问题:

char str[] = "Test";

这给了你修改字符串的能力,因为它不再是const。

问题是C++中默认的字符串常量类型是conchchar */p>
char *str="Test";

在下一行中,将非常量字符*分配给常量字符*

char *str="Test";

这样,当你把这个变量传递给反向函数时,你就尝试写只读内存。这违反了C++的规则,导致了意外的行为。 按如下方式定义字符串以解决问题:

char str[] = "Test";


这给了你修改字符串的能力,因为它不再是const了。< /p>你不能写字符串文字,<代码> char * STR =“test”;< /C>是根本原因,并且不是有效C++,我很惊讶你的编译器不抱怨它应该是<代码> char const * STR =“test”;< ch/*> =“test”。String文字指向的是Cist-char *类型,但是STR指向的值不能改变,因为它是常数。@ BKVNET自从C++ 03以来就被弃用了,它是C++ C++ 11的无效。@ BKVNET在<代码> char const *//>和<代码> const char */COD>之间没有区别。它们是同一类型。f

char*const
@vivek如果您按照给定答案char str[]=“test”进行操作,那么您传递的不是const char*,而是char*,应该可以正常工作。您不能写入字符串文本,
char*str=“test”是根本原因,不是有效的C++,我很惊讶你的编译器不抱怨它应该是<代码> char const *ST= =“test”;< /c> >实际上char *STR =“test”String文字指向的是Cist-char *类型,但是STR指向的值不能改变,因为它是常数。@ BKVNET自从C++ 03以来就被弃用了,它是C++ C++ 11的无效。@ BKVNET在<代码> char const *//>和<代码> const char */COD>之间没有区别。它们是同一类型。f
char*const
@vivek如果你按照给定的答案char str[]=“test”来做,那么你传递的不是一个const char*,而是一个char*,应该可以正常工作。“你将一个非const char*分配给一个const char*?!“你将一个非const char*分配给一个const char*”?!谢谢你的回复。还有一点需要澄清。假设我将其初始化为字符串数组。因此,当我将相同的字符串数组传递给reverse函数时,它应该抛出异常,因为它接受char*str,稍后将在函数内部再次修改它。你是指字符串数组的
char[]
吗?是的。像这样。char str[]=“Test”;然后您不必更改函数的原型,因为从数组到指针的转换是自动完成的,正如我在回答中提到的,为了使程序运行,您只需要更改行
char*str=“Test”
谢谢你的回复。还有一点需要澄清。假设我将其初始化为字符串数组。因此,当我将相同的函数传递给reverse函数时,它应该抛出异常,因为它接受char*str,该函数稍后将在函数内部再次修改。你是指字符串数组的
char[]
吗?是的。像这样。char str[]=“Test”;然后您不必更改函数的原型,因为从数组到指针的转换是自动完成的,正如我在回答中提到的,为了使程序运行,您只需要更改行
char*str=“Test”