当我编译并运行我的代码时,我在打印“启动”后立即收到总线错误。 以下是发生的事情:
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;
}
答案 0 :(得分:4)
您正在修改通常位于只读内存中的字符串文字。该标准还指出,尝试修改文字是未定义的行为。
当您使用指向字符串文字的指针时,您应该将它们声明为const,const char * str="text";
或数组char str[] = "text";
改为例如:
char str1[] = "apple";
在这种情况下,编译器将在堆栈上创建一个数组,并将只读字符串文字复制到其中。
答案 1 :(得分:4)
如果您将字符串定义为:
char *str1 = "apple";
您不被允许修改内容 - 标准很明显,这是未定义的行为(a)。使用:
char str1[] = "apple";
相反,它会给你一个可修改的副本。它在功能上等同于:
char str1[6]; strcpy (str1, "apple");
(a) C99 6.4.5 "String literals"
,第6
段:
如果这些数组的元素具有适当的值,则未指定这些数组是否相同。如果程序试图修改这样的数组,则行为是未定义的。