0

当我编译并运行我的代码时,我在打印“开始”后立即收到一个总线错误。这是发生的事情:

bash-3.2$ ./remDup
启动
总线错误

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

void removeDups(char* str) 
{
    int len = strlen(str);
    int i = 0;

    for (i = 0; i < len; i++) {
        char a = str[i];
        int k = i + 1;
        int c = 0;
        int j = 0;

        for (j = k; j < len; j++) {
            if (a != str[j]) {
                str[k] = str[j];
                k++;
            } else c++;
        }

        len -= c;
    }

    str[len] = '\0';
}

int main(int argc, const char* argv[] )
{
    char *str1 = "apple";

    printf("%s -> ", str1);
    removeDups(str1);
    printf("%s\n ", str1);

    return 1;
}
4

2 回答 2

4

您正在修改通常驻留在只读内存中的字符串文字。该标准还指出,尝试修改文字是未定义的行为。

当您使用指向字符串文字的指针时,您应该将它们声明为 constconst char * str="text";或数组char str[] = "text";

更改为例如:

char str1[] = "apple";

在这种情况下,编译器将在堆栈上创建一个数组,并将只读字符串文字复制到其中。

于 2011-03-30T08:25:36.087 回答
4

如果将字符串定义为:

char *str1 = "apple";

您不得修改内容 - 标准非常清楚这是未定义的行为(a)。利用:

char str1[] = "apple";

相反,它会给你一个可修改的副本。它在功能上等同于:

char str1[6]; strcpy (str1, "apple");

(a) C996.4.5 "String literals"6规定:

如果它们的元素具有适当的值,则未指定这些数组是否不同。如果程序尝试修改这样的数组,则行为未定义。

于 2011-03-30T08:25:45.967 回答