【问题标题】:Return a pointer to a char array in C在 C 中返回指向 char 数组的指针
【发布时间】:2011-02-07 06:22:32
【问题描述】:

我在 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,并尝试了那里建议的“静态”技术,但仍然无法让程序正常工作。谁能指出它到底有什么问题以及我将来应该注意什么?

【问题讨论】:

  • @snitko:main()的返回类型在哪里?

标签: c arrays chars


【解决方案1】:

这是试图修改不可修改的数据。

“hello”是一个常量字符串,存储在内存中的某处。那么,你想要做的是改变它,而这通常是不允许的。我不明白你所说的“静态”是什么意思,但你想要的是......

int main()
{
  char hello_str[16];
  strcpy(hello_str, "hello");
  printf("%s", squeeze(hello_str, 'o'));
}

【讨论】:

    【解决方案2】:

    传递给挤压函数的第一个参数是一个read-only 字符串文字"hello",您正在尝试修改它。

    改为传递一个可修改的字符数组:

    char str[] = "hello";
    printf("%s", squeeze(str, 'o'));
    

    【讨论】:

    • 也可以调用最小意外原则来建议制作字符串的副本,而不是。如果我将 char* 传递给返回 char* 的函数,我可能不会期望它会就地修改数组。 (API 设计者在是否使用 const 时经常马虎。)
    【解决方案3】:

    问题是 constant char 数组 "hello" 可能无法被传递给它的函数正确修改。因此,只需确保您传递的是一个非常量数组(例如,通过传递一个本地数组,只要在 squeeze 的调用者之外不需要结果):

    int main()
    {
      char xxx[] = "hello";
      printf("%s", squeeze(xxx, 'o'));
    
      return 0;
    }
    

    您希望这样的常量只能传递给 const 参数(以便编译器本身可以告诉您您做错了什么),但是,唉,这不是 C 标准所要求的(大概是因为与历史代码向后兼容)。

    【讨论】:

    • 没有什么临时的,字符串存储在“静态”内存中。
    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2018-04-05
    • 2018-06-27
    相关资源
    最近更新 更多