【问题标题】:Syntax for returning array pointers in C在 C 中返回数组指针的语法
【发布时间】:2020-03-11 02:41:12
【问题描述】:

编辑: 在下面我在代码示例部分中进一步编写的示例中,声明返回类型为 array pointer 的函数的正确语法应如下所示:

int (*my_function(void))[10]
{
    ...
}

对于可能遇到相同问题的未来读者的重要提示:不要 typecast malloc!只是不要。感谢 user3386109 的那个。 Further reading on the why.

感谢 Andrew Henle 和 Eric Postpischil 的回答。 Here's真的很好的解释,如果有人想进一步阅读该主题。 原帖如下:

什么我想知道

如何在 C 中返回指向数组的指针。

为什么我想知道

因为它(是?)应该可以这样做。

为了什么我想要它

从函数返回多维数组。

“你尝试过结构体吗?”

是的,但这与结构无关。这个线程的重点(不是双关语)是用 pointers 来做的。

代码示例

我的例子是错误的,所以我在这里问的原因,但在这里:

int (*)[10]my_function(void) // Should be returning a type of array pointer to 10-elements array. Sure enough it's not.
{
    int (*ptr)[10] = (int (*)[10]) malloc(10 * sizeof(int));
    return ptr;
}

int main(void)
{
    printf("Address of ptr is: %d", my_function());
    return 0;
}

如您所见,我也不确定如何将 malloc 类型转换为指向 10 元素数组的数组指针。如果你知道怎么做,请告诉我。

重要提示

据我所知,在这种情况下使用双指针(指向指针的指针)是错误的。 代码示例:

int **my_function(void); // WRONG, afaik

基本原理this 视频,16:22。

我已经尝试在网上搜索,并且在一些书籍中,他们有使用结构体、指向数组的指针作为函数参数的示例,但不是这个。

如果您对这个主题有一些了解,请回复,我将不胜感激。

【问题讨论】:

  • “我不确定如何对 malloc 进行类型转换”。简单的。别。 You should not cast the return value from malloc.
  • 如果你做了typedef int tenIntArray[10];,你期望从数组的开头有多少个普通的int元素tenIntArray *example = ...;然后example[ 2 ] 是?提示:这不是第三个int 元素...
  • @user3386109 谢谢,我不知道。在我链接到的关于指针的教程系列中,讲师说要 typecast malloc,所以我只是认为这是正确的。
  • @ward0 我没有看过视频,但是如果讲师使用的是 MSVC,请注意 MSVC 实际上是一个 C++ 编译器,对当前标准 C 的支持有限——它不是一个兼容的 C 编译器30 岁的 C89。
  • @Andrew Henle 他确实在使用 MSVC,可能是这样。

标签: c arrays function multidimensional-array return


【解决方案1】:

数组不能按值传递,除非您将它们嵌入到结构中。当您将数组传入或传出函数时,它会衰减为指向第一个元素的指针。所以返回一个动态分配的数组的方式是作为一个单一的指针。

int *my_function(void) {
    int *ptr = malloc(10 * sizeof(int));
    return ptr;
}

无需在类型中指定维度,因为这将被忽略。

这不是一个多维数组,它只是一个由 10 个int 组成的一维数组。

类型声明int (*ptr)[10] 是一个包含 10 个整数指针的数组,而不是一个指向 10 个整数数组的指针。

【讨论】:

  • 没有必要在类型中指定维度,因为这将被忽略。这可能有点强。如果将指针分配给实际上是指向数组的指针的指针,例如typedef int arrayType[10];,则肯定不会被忽略。在这种情况下,取消引用指针可能不会产生预期的结果。
  • 您不能分配给数组。将其设为 typedef 会改变这一点吗?
  • 感谢您的回复。我想你误解了我的问题,我应该为此负责。您可以使用指针point 指向一维数组,这样您就可以将数组从函数传递到函数(正如您自己所说,数组总是通过引用传递)。我想知道的是创建 type 指向数组的指针的指针的语法,以便传递 multidimensional 数组(从返回函数和传递给函数)。
  • 您不能分配给数组 True,还有其他区别。因此我的“可能不会产生预期的结果”评论。我个人永远不会 typedef 一个数组,除非出于某种原因我想立即 typedef 一个指针,因为某种疯狂的原因。
  • @ward0 我想知道的是创建指向数组的指针类型的指针的语法,以便传递多维数组阅读:Correctly allocating multi-dimensional arrays
【解决方案2】:

int (*p)[10] 声明了一个指向 10 个数组的指针 int

int (*)[10] 是一种类型,它是指向 10 个 int 的数组的指针。但是请注意,您不需要在 C 中强制转换 malloc 的结果。作为 void * 用作赋值的初始值设定项或右操作数,它会自动转换为目标类型。

int (*foo(void))[10] 声明了一个不带参数的函数,该函数返回一个指向 10 个数组的指针 int

请注意,int (*foo(void))[10] 可以从int (*p)[10] 派生,只需将p 替换为foo(void)。通常,要获得函数的任何返回类型,请为该类型的对象编写声明,然后将对象名称替换为函数名称,后跟其通常的参数声明。

【讨论】:

  • 非常感谢,这回答了我的问题。我开始轻轻地考虑使用int (*foo(void))[10],但是函数前面的[10]对我来说似乎不自然(有点像声明一个函数数组lol),所以我立即放弃了这种可能性.再次感谢!
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 2012-06-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 2021-10-16
相关资源
最近更新 更多