C:返回

时间:2015-09-29 11:17:38

标签: c

我正在学习C编程语言,我试图创建一个创建子字符串然后返回它的函数。 我找到了这段代码here

void substring(char s[], char sub[], int p, int l) {
   int c = 0;

   while (c < l) {
      sub[c] = s[p+c-1];
      c++;
   }
   sub[c] = '\0';
}

我想摆脱参数中的char sub[],而是返回在函数内部创建的字符串。 这是我认为最接近的(我认为),但我总是遇到分段错误(核心转储)运行时错误。

char substring(char s[], int p, int l) {
   int c = 0;
   char sub[1000];

   while (c < l) {
      sub[c] = s[p+c-1];
      c++;
   }
   sub[c] = '\0';

   return *sub;
}

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

如果要返回一个字符串,则不应返回单个字符,而应返回char *。由于sub是本地字符数组,因此您无法返回sub。如果您坚持从函数返回指针,则需要分配动态内存。然后,呼叫者有责任释放记忆。因此你应该做这样的事情:

// NOTE: caller takes ownership of the returned value
char* substring(char s[], int p, int l) {
   int c = 0;
   char* sub = malloc(l + 1);

   while (c < l) {
      sub[c] = s[p+c-1];
      c++;
   }
   sub[c] = '\0';

   return sub;
}

注意:感谢@ MOehm的评论我注意到,当前面已知大小时,不需要分配固定大小为1000的字符串。这仍然可能导致逻辑更改,因此您可能需要更改其余代码。

答案 1 :(得分:2)

问题:

  • 您的返回类型为char,这意味着您将返回单个字符。这应该是char*,因为你想返回一个指向字符串开头的指针。
  • 您正在使用本地声明的数组来保存结果。局部变量驻留在堆栈上,一旦函数返回就不可用。您需要使用malloc分配堆内存,将子字符串存储在该内存块中,然后返回指针。请注意,这意味着调用者需要获取此块的所有权(即在不需要之后free

请注意,此实现不必要地强制调用者使用堆内存。如果调用者想要将字符串放在其他地方(例如在内存映射文件中),则需要复制它。原始实现使用inout参数可能是为了避免这种妥协。

答案 2 :(得分:1)

正如其他答案中已经提到的,您无法返回指向局部变量的指针。事实上,最好的办法是不要关心内存分配,而是将其留给调用者:

void substring (size_t index, 
                size_t length, 
                const char source[], 
                char dest[length+1])
{
  memcpy(dest, source + index, length);
  dest[length] = '\0';
}