为什么我不能将数组分配给另一个数组的子集?

时间:2014-01-08 11:02:10

标签: c arrays pointers clang

我想编写一个返回另一个数组的一部分的函数。以下是我尝试实现它的方法:

char *subarrayWithRange(char *array, int location, int length)
{
  char subarray[length];
  subarray = (array + location);
  return subarray;
}

当我尝试编译它时,clang给了我这个错误:

error: array type 'char [length]' is not assignable

显然,我无法将数组分配给另一个数组的子数组。但是,当我将子数组定义为指针时,这是有效的:

char *subarrayWithRange(char *array, int location, int length)
{
  char *subarray;
  subarray = (array + location);
  return subarray;
}

现在,我无法定义子阵列的长度。这是C语言吗?我可以以某种方式解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

您无法分配数组。您也无法返回本地数组,因为当函数退出时,它使用的内存超出了范围。您必须使用动态(堆)内存,例如使用malloc()要分配。

此外,如果您打算将子数组作为有效字符串,则必须终止该子数组:

char * substringWithRange(const char *string, size_t start, size_t length)
{
  char *p = malloc(length + 1);
  if(p != NULL)
  {
    memcpy(p, string + start, length);
    p[length] = '\0';
  }
  return p;
}

请注意,上面假设length永远不会超过输入长度,因为没有检查。你应该添加这样的检查,然后截断。