当我编译并运行代码时,在打印“正在启动”后立即出现总线错误。
这是发生了什么:

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;
}

最佳答案

如果将字符串定义为:

char *str1 = "apple";


您无权修改内容-标准非常明确,这是未定义的行为(a)。采用:

char str1[] = "apple";


相反,它将为您提供可修改的副本。它在功能上等同于:

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




(a)C99 6.4.5 "String literals"6段指出:


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

关于c - 来自C的printf的不合理总线错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5483795/

10-10 16:08