返回指向C中char数组的指针

时间:2010-04-13 02:06:34

标签: c arrays chars

我在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,并尝试了那里建议的'静态'技术,但仍然无法使程序正常工作。任何人都可以指出它究竟出了什么问题,将来我应该注意什么?

3 个答案:

答案 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'));
}