【问题标题】:Access violation error when reversing a string c++ [duplicate]反转字符串c ++时出现访问冲突错误[重复]
【发布时间】:2012-12-12 21:47:41
【问题描述】:

可能重复:
Why do I get a segmentation fault when writing to a string?

下面的简单函数应该就地反转一个字符数组。

void reverse(char* str)
{
    char* last = str;

    // find end of the string
    while(*last) {
        ++last;
    }

    // swap characters until the pointers meet in the middle
    while(str < last)
    {
        --last; 
        char temp = *str;
        *str = *last;
        *last = temp;
        ++str;
    }
}

int main()
{
    char* a= "Hello";
    reverse(a);
    return 0;
}

代码编译。但它会引发有关访问冲突的运行时错误。根据调试器,罪魁祸首是以下行:

char temp = *str;

任何想法为什么会发生?

【问题讨论】:

  • 这不再是有效的 C++ 代码,并且有充分的理由。
  • 您包含 &lt;iostream&gt; 但不使用任何流,您使用 using namespace std 但不使用该命名空间中的任何内容。

标签: c++ char


【解决方案1】:
char* a= "Hello";

指针a 指向一个字符串字面量。根据标准,尝试修改字符串文字会导致未定义的行为。在您的实现中,分段错误表明编译器选择将字符串文字放在不可修改的内存中。

a 声明为可修改的字符串。例如,像这样:

char a[] = "Hello";

【讨论】:

  • 来吧,你应该知道最好不要用数百个重复来回答这样的问题
  • @EdS。我不跟随,回答骗子没有错。对于这样一个简短的问题,答案比寻找骗子要快,因此可以帮助操作员更快。然后,您可以投票关闭以获取更多详细信息。
  • 这很有帮助,我不是说没有。但是,如果回答欺骗是好的(尤其是像这样明显重复的问题),那么为什么我们首先要有一个作为重复关闭的类别?在任何论坛上,您通常不想要同一问题的 N 个副本,您只想要一个好的,然后链接回它。回答明显的欺骗只是通过一遍又一遍地回答同一个琐碎问题来获得声望的一种方式。
  • 还有@Alex,我相信它对您有所帮助,但简单的搜索也会对您有所帮助。搜索“C char* crash”会返回此主题作为第一个结果:stackoverflow.com/questions/4226829/c-c-char-pointer-crash
  • 我还要指出,该标准没有说明将字符串文字存储在“不可修改的内存”中,只是尝试修改这样的字符串会导致未定义的行为。好的,我会......现在闭嘴:D
猜你喜欢
  • 2019-04-05
  • 1970-01-01
  • 2023-03-31
  • 2017-11-05
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
相关资源
最近更新 更多