C 从函数返回字符数组

C 从函数返回字符数组,c,C,我试图从函数返回一个字符数组。根据我读到的所有内容,我知道我无法返回数组本身,因为数组是二等公民。但据我所知,我可以创建一个指向它的指针,并使它成为静态的。我两个都试过了,但都没能编译。你知道为什么吗 int main () { char *hold_array[] = get_array (); return 0; } char *get_array (void

我试图从函数返回一个字符数组。根据我读到的所有内容,我知道我无法返回数组本身,因为数组是二等公民。但据我所知,我可以创建一个指向它的指针,并使它成为静态的。我两个都试过了,但都没能编译。你知道为什么吗

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

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

char *hold_array[] = get_array ();

或者(最好是IHMO)使用
malloc

尝试更改

char *hold_array[] = get_array ();


或者(最好是IHMO)由于类型不匹配而使用
malloc

编译错误@贾斯汀皮尔指出,也需要
const

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

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

由于类型不匹配而导致编译错误@贾斯汀皮尔指出,也需要
const

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

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

对于要执行的操作,最好使用动态分配数组,然后返回指向已分配内存的指针

例如:

char*char\u数组\u ptr=malloc(sizeof(char)*size\u数组)

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

函数应该有一个类似于
char*return\u array()
的签名,并且应该在函数末尾返回指向已分配内存的指针-
return array\u 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
后,不要忘记分配内存。

对于要执行的操作,最好使用动态分配数组,然后返回一个指向分配内存的指针

例如:

char*char\u数组\u ptr=malloc(sizeof(char)*size\u数组)

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

函数应该有一个类似于
char*return\u array()
的签名,并且应该在函数末尾返回指向已分配内存的指针-
return array\u 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
后,不要忘记分配给它的内存。

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

您可以将其声明为
**hold\u 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
时,编译器假定您指的是数组本身,因为您没有另外指定数组的成员。因此,只返回
数组
本身的地址。这与
**保持阵列
相同。这意味着
hold\u array=array
<代码>**hold_array
是指向指针数组的单个指针
array[2]
是一个指针数组,它为两个指针分配了空间。

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

您可以将其声明为
**hold\u 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
时,编译器假定您指的是数组本身,因为您没有另外指定数组的成员。所以只有地址