我正在尝试从函数返回一个char数组。根据我读过的所有内容,我知道我无法返回数组,因为数组是二等公民。但从我的理解,我可以创建一个指向它的指针,并使其静态。我已经尝试了两个,但是我没有编译。有什么想法吗?
int main ()
{
char *hold_array[] = get_array ();
return 0;
}
char *get_array (void)
{
static char *array[] = {"test1", "test2"};
return (array);
}
答案 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个指针分配空间。