我在StackOverflow上看到了很多关于它的问题,但是阅读答案并不清楚这一点,可能是因为我是C编程的新手。这是代码:
#include <stdio.h>
char* squeeze(char s[], char c);
main()
{
printf("%s", squeeze("hello", 'o'));
}
char* squeeze(char s[], char c)
{
int i, j;
for(i = j = 0; s[i] != '\0'; i++)
if(s[i] != c)
s[j++] = s[i];
s[j] = '\0';
return s;
}
它编译并在运行时出现分段错误。我已经阅读了关于返回数组的this faq,并尝试了那里建议的'静态'技术,但仍然无法使程序正常工作。任何人都可以指出它究竟出了什么问题,将来我应该注意什么?
答案 0 :(得分:6)
传递给squeeze函数的第一个参数是read-only
字符串文字"hello"
,您试图修改它。
相反传递一个可修改的char数组:
char str[] = "hello";
printf("%s", squeeze(str, 'o'));
答案 1 :(得分:3)
问题是常量 char数组"hello"
可能无法被传递给它的函数正确修改。所以,只要确保你传递一个非常量数组(例如通过使一个本地数组传递,只要在squeeze
的调用者之外不需要结果):
int main()
{
char xxx[] = "hello";
printf("%s", squeeze(xxx, 'o'));
return 0;
}
你希望这样的常量只能传递给const
参数(这样编译器本身可以告诉你你做错了什么),但是,唉,这不是C标准强制执行(大概是出于向后兼容历史代码的原因)。
答案 2 :(得分:3)
这是试图修改不可修改的数据。
“hello”是一个常量字符串,存储在某个内存中。那么,你要做的就是改变它,而这通常是不允许的。我不明白你的意思是什么“静态”,但你想要的是...... ...
int main()
{
char hello_str[16];
strcpy(hello_str, "hello");
printf("%s", squeeze(hello_str, 'o'));
}