在C

时间:2017-01-21 17:32:11

标签: c arrays string

想象一下这个相当简单的场景。我有一些函数可以执行一些操作并最终返回一个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的数组指针衰减功能是微不足道的。

2 个答案:

答案 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"};

代替。