0

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

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

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

4 回答 4

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);
}
于 2013-06-26T01:48:04.237 回答
1

尝试改变

char *hold_array[] = get_array ();

char **hold_array = get_array ();

或者(最好还是 IHMO)使用malloc.

于 2013-06-26T01:45:30.570 回答
1

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

例如:

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 */
}

完成使用后不要忘记释放分配的内存malloc

于 2013-06-26T01:49:03.637 回答
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 个指针分配空间。

于 2013-06-26T02:19:34.373 回答