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

时间:2016-04-10 08:19:28

标签: c++ pointers

我正在接触"访问违规"错误,但无法确定它的根本原因。我是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();
}

2 个答案:

答案 0 :(得分:2)

您正在获得segmentation fault,因为您正在尝试编辑只读内存,其中包含文字字符串&#34; Test&#34;存储(因为字符串文字在c ++中是const char*)。

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

char str[] = "Test";

答案 1 :(得分:0)

问题是C ++中默认的字符串常量类型是const char *。

在以下行中,将非const char *分配给const char *。

char *str="Test";

因此,当您将此变量传递给reverse函数时,您尝试写入只读内存。这违反了C ++的规则,并导致意外行为。

定义像这样的字符串来解决问题:

char str[] = "Test";

这使你能够修改字符串,因为它不再是一个const。