【问题标题】:Returning an array of strings (char*) in C在 C 中返回字符串数组 (char*)
【发布时间】:2017-01-21 17:32:10
【问题描述】:

所以想象一下这个相当简单的场景。我有一些函数可以进行一些操作并最终返回一个 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-pointer-types]

    返回 arr;

              ^

但是我应该怎么做返回参数呢?指向 char 数组的指针?我认为在 C 中返回数组是不好的做法。

运行此程序会导致无用的分段错误。

那么我做错了什么?我不能返回指向 char 指针数组的指针吗?因此,char **?我是否将数组/指针衰减混为一谈?我将如何返回一个字符串数组?有没有办法在不使用static 关键字的情况下返回字符串数组?

编辑:你们肯定能够理解我的困惑吗?这不像 C 语言的数组指针衰减功能是微不足道的。

【问题讨论】:

  • 您没有char * 的数组。 char** 和 char[][] 不是同一种数据类型。为什么不将你的数组声明为static char *arr[] = {"hi", "bye", "cry"}; 然后你可以像原始代码一样返回arr。
  • 你做错了什么?您想返回一个 char 指针数组,但没有 拥有 一个 char 指针数组。 (这就像想回到一个不会发生全球变暖的世界。)

标签: c arrays string


【解决方案1】:

在语句 return arr; 中,arr 将衰减为指向 10 个字符数组的指针,即类型为 char (*)[10] 而函数的返回类型为 char **。两种指针类型不兼容。
您可以将声明中arr 的类型从数组数组更改为指针数组。

static char *arr[3] = {"hi", "bye", "cry"};   

或者你可以将函数的返回类型改为char (*)[10]

char (*func())[10] {...}

【讨论】:

  • 这段代码并不像你想象的那样。该声明创建了一个包含 10 个指向 char 的指针的数组。我相当怀疑您的目标是指向 10 个字符的指针数组。那将是 char (*arr[])[10]。有关这个有趣话题的更多信息,请参阅:cdecl.ridiculousfish.com
  • @PeterCamilleri; char (*arr[])[10] 将声明 arr 为指向 10 个 chars 数组的指针数组。我打算将arr 声明为指向char 的3 个指针的数组。错误地我写了10而不是3。
  • 好的,但无论如何,即使这三个也不需要,因为编译器可以计算出初始化常量有多少元素。通过不重复这一点信息,出错就少了一件。在一些编程社区中,这被称为 DRY - 不要重复自己。在“C”中不常见,但在可能的情况下仍然是一个有用的概念。
  • 嗯,是的,直到您需要更改字符串的数量并保持计数同步,但是是的,基本上是无害的。
【解决方案2】:

数组:

static char arr[3][10] = {"hi", "bye", "cry"}; 

是一个由 10 个字符组成的数组。这与 char ** 不兼容。

试试

static char *arr[] = {"hi", "bye", "cry"};

改为。

【讨论】:

  • 谢谢!我可以在不使用static 的情况下返回char* 数组吗?
  • @KennethWorden 不,你不能。如果你返回一个指向局部变量的指针,你有未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多