【问题标题】:Access violation writing location when working with pointers to char使用指向 char 的指针时访问冲突写入位置
【发布时间】:2011-12-10 18:56:03
【问题描述】:

我正在编写一个非常简单的程序,可以从字符串中删除重复字符。我运行它的 Visual Studio 并得到了错误:

inteviews.exe 中 0x00d110d9 处未处理的异常:0xC0000005:访问冲突写入位置 0x00d27830。

我真的不明白问题出在哪里。当前单元格获取下一个单元格的值。

void remove(char *str, char a) {
    while (*str != '\0') {
        if (*(str+1) == a) {
            remove(str + 1, a);
        }

        *str = *(str +1 );//HERE I GET THE ERROR
        ++str;
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    char *str = "abcad";

    while (*str != '\0') {
        remove(str,*str);
        str++;
    }

    std::cout << str << std::endl;

    return 0;
}

编辑:

我已经尝试将其更改为 char str[] = "abcad",但我仍然遇到同样的错误。

【问题讨论】:

  • Getting Segmentation Fault 的可能重复项
  • @rob 您在这里提出了 50 个问题,但只投了一次。这个比较穷。请尝试在未来更充分地参与。
  • 如果您正在编写 C 或 C++,请先弄清楚自己

标签: c++ string c-strings


【解决方案1】:

您正在尝试修改字符串文字。你不能那样做。

char *str = "abcad";

这是一个字符串文字。它是在只读内存中创建的,因此尝试写入它是访问冲突。

【讨论】:

  • 我无法更改的原因是什么?绕过它的方法是什么?谢谢
  • @rob - 初始化为数组或malloc() 内存并使用snprintf() 将abcad 复制到该内存中。
  • 这只是冰山一角。
  • @David - 是的......我没有尝试进一步破译他的代码,因为这是导致访问冲突的具体问题。
【解决方案2】:

一个问题是您创建了一个只读字符串文字并试图对其进行修改:

char *str = "abcad"; // String literals are read-only!

您可以改用 char 数组:

char str[] = "abcad";

【讨论】:

  • 已经尝试过了,我在同一行遇到了同样的错误。有什么想法吗?
【解决方案3】:

你的程序有各种各样的问题。我开始尝试把它们都写下来,但我觉得代码是不可救药的。它有索引错误、参数传递错误、可疑递归等等。

指出尝试修改只读文字错误的其他答案是正确的。这就是您发布的代码中出现错误的原因。

在我看来,您遇到麻烦的主要原因是,当您只有一个缓冲区时,代码更难编写。您一直在努力解决设计中的这个限制,但是使用第二个缓冲区,代码是微不足道的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    const char *input = "abcad";
    char *output = malloc(strlen(input)+1);

    char *in = input;
    char *out = output;
    while (*in)
    {
        if (*in != input[0])
        {
            *out = *in;
            out++;
        }
        in++;
    }
    *out = '\0';

    printf("%s\n", output);

    free(output);

    return 0;
}

如果您想变得非常聪明,实际上只需一个缓冲区即可轻松管理,只要您保留两个不同的指针进行迭代。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char str[] = "abcad";
    char compare = str[0];

    char *in = str;
    char *out = str;
    while (*in)
    {
        if (*in != compare)
        {
            *out = *in;
            out++;
        }
        in++;
    }
    *out = '\0';

    printf("%s\n", str);

    return 0;
}

请注意,我们必须在缓冲区中获取第一个字符的副本,该字符被删除,因为它可能会被迭代修改。

所以现在你回到了你开始的地方,只有一个缓冲区。但是现在代码可以运行并且很容易理解。

请注意,我的答案是根据您的标签用 C 编写的,但请注意您的代码是 C++。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2017-08-23
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多