从函数返回字符数组

时间:2013-06-26 01:41:59

标签: c

我正在尝试从函数返回一个char数组。根据我读过的所有内容,我知道我无法返回数组,因为数组是二等公民。但从我的理解,我可以创建一个指向它的指针,并使其静态。我已经尝试了两个,但是我没有编译。有什么想法吗?

int main ()
{
  char *hold_array[] = get_array ();                                                              
  return 0;
}

char *get_array (void)
{
   static char *array[] = {"test1", "test2"};
   return (array);
}

4 个答案:

答案 0 :(得分:2)

由于类型不匹配而编译错误。 @JustinPeel指出也需要const

int main(void)
{
    char **hold_array = get_array ();
    return 0;
}

char **get_array(void)
{
     static const char *array[] = {"test1", "test2"};
     return (array);
}

答案 1 :(得分:1)

尝试更改

char *hold_array[] = get_array ();

char **hold_array = get_array ();

或者(更好的是IHMO)使用malloc

答案 2 :(得分:1)

对于你想要做的事情,最好使用malloc动态分配数组,然后返回指向已分配内存的指针。

E.g:

char* char_array_ptr = malloc(sizeof(char) * size_of_array);

请注意sizeof(char)是多余的,因为标准保证char类型为1,但其他类型需要sizeof

你的函数应该有一个类似于char* return_array()的签名,你应该在函数末尾返回指向已分配内存的指针 - return array_ptr;

总而言之,我们会有类似的东西:

char* allocate_array()
{
    char* ptr = malloc(20); /* size here will be 20 */

    strcpy(ptr, "Just a normal string."); /* copy string to that pointer */

    return ptr; /* return pointer for further use */
}

完成使用后,不要忘记free分配了malloc的内存。

答案 3 :(得分:1)

*hold_array[]是一个指针数组。函数get_array返回单个指针,尽管返回的指针是指向char *指针数组的指针。但是,您不能将*hold_array[]声明为没有任何维度的指针数组。编译器不知道要为它分配多少空间。它不知道你需要多少指针。

您可以将其声明为**hold_array。这是一个指向指针数组的单指针。我知道这听起来是一样的,但事实并非如此。在*hold_array[]的情况下,您正在分配多个指针,因此需要维度。在**hold_array的情况下,您将分配一个指向指针数组的指针。在初始化程序static char *array[]中,编译器会看到您需要两个指针,并在内部为您*array[2]维度。

因此,在main()中,您要求编译器创建一个由char *指针组成的未知维数组。函数get_array返回指针数组的地址,但不返回数组中的各个指针。请记住,array[0]是指向字符串"test1"的指针,array[1]是指向字符串"test2"的指针。字符串本身是字符数组,最后有一个0字节。

另一种思考方式是:

char *test1 = "test1";
char *test2 = "test2";

char *array[2];
char **hold_array;

array[0] = test1;
array[1] = test2;

hold_array = array;

printf("\n%s = %s", hold_array[0], array[0]);  //print the same string

因此,当您返回array时,编译器会假定您指的是数组本身,因为您没有另外指定数组的成员。因此,只返回array本身的地址。这与**hold_array相同。这意味着hold_array = array**hold_array是一个指向指针数组的指针。 array[2]是一个指针数组,为2个指针分配空间。