【问题标题】:Access violation writing Location error during string assignment字符串分配期间访问冲突写入位置错误
【发布时间】:2016-04-10 08:19:28
【问题描述】:

我收到“访问冲突”错误,但无法确定其根本原因。我是 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();
}

【问题讨论】:

  • 您不能写入字符串文字,char *str="Test"; 是根本原因并且不是有效的 C++,我很惊讶您的编译器没有抱怨它应该是 char const* str ="Test";。跨度>
  • 其实 char* str="Test" 在 c++ 中是允许的。字符串文字被转换为 const char* 类型。但是str指向的值不能改变,因为它是一个常数。
  • @bkVnet 自 C++03 起已弃用,自 C++11 起无效。
  • @bkVnet char const*const char* 没有区别,它们是同一类型。你在想char* const
  • @vivek 如果你像给定的答案 char str[]="test" 那样做,那么你传递的不是 const char* 而是 char* 应该可以正常工作。

标签: c++ pointers


【解决方案1】:

你得到一个segmentation fault,因为你试图编辑存储文字字符串“Test”的只读内存(因为字符串文字在c++中是const char*)。

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

char str[] = "Test";

【讨论】:

  • 感谢您的回复。再澄清一件事。假设我将其初始化为字符串数组。因此,当我将相同的内容传递给 reverse 函数时,它应该抛出异常,因为它接受 char *str 稍后将再次在函数内部进行修改。
  • 你的意思是char [] by 字符串数组
  • 是的。像这样 。 char str[] = "测试";
  • 那么您不必更改函数的原型,因为从数组到指针的转换会自动为您完成,请参阅this
  • 正如我在答案中提到的,为了使程序运行,您唯一需要更改的是char *str="Test";
【解决方案2】:

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

在下一行中,您将一个非 const char * 分配给一个 const char *。

char *str="Test";

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

改为这样定义你的字符串来解决问题:

char str[] = "Test";

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

【讨论】:

  • "你将一个非 const char * 分配给一个 const char *。"?!
猜你喜欢
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多