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