想象一下这个相当简单的场景。我有一些函数可以执行一些操作并最终返回一个char指针数组。为简单起见,让该函数不带参数:
#include <stdio.h>
char **func(void);
int main() {
printf("%s\n", func()[0]);
return 0;
}
char **func() {
static char arr[3][10] = {"hi", "bye", "cry"};
return arr;
}
我希望能够在main()
函数中访问此数组。我将数组设为静态,以避免将地址返回到func()
范围内定义的局部变量。此代码编译,但带有警告:
警告:从不兼容的指针类型返回 [-Wincompatible指针类型]
return arr;
^
但是我应该怎么做返回参数呢?指向char数组的指针?我认为在C中返回数组是不好的做法。
运行此程序会导致无用的分段错误。
那么我做错了什么?我不能返回指向char指针数组的指针吗?因此,char **
?我是在混淆阵列/指针衰减吗?我如何返回字符串数组?有没有办法在不使用static
关键字的情况下返回字符串数组?
编辑:当然,你们都能够理解我的困惑吗?它不像C的数组指针衰减功能是微不足道的。
答案 0 :(得分:2)
在return arr;
语句中,arr
将衰减指向10个字符的数组,即char (*)[10]
类型,而函数的返回类型为char **
。两种指针类型都不兼容
您可以将声明中的arr
类型从数组数组更改为指针数组。
static char *arr[3] = {"hi", "bye", "cry"};
或者您可以将函数的返回类型更改为char (*)[10]
char (*func())[10] {...}
答案 1 :(得分:2)
数组:
static char arr[3][10] = {"hi", "bye", "cry"};
是一个包含10个字符的数组。这与char **不兼容。
尝试
static char *arr[] = {"hi", "bye", "cry"};
代替。