使用指向char的指针时访问冲突写入位置

时间:2011-12-10 18:56:03

标签: c++ string c-strings

我正在编写一个非常简单的程序,用于从字符串中删除重复的字符。我运行了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",但我仍然遇到同样的错误。

3 个答案:

答案 0 :(得分:9)

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

char *str = "abcad";

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

答案 1 :(得分:6)

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

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

您可以使用char数组:

char str[] = "abcad";

答案 2 :(得分: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 ++。