【问题标题】:Returning pointer to statically defined array of structs返回指向静态定义的结构数组的指针
【发布时间】:2017-10-27 00:11:51
【问题描述】:

我静态定义了一个myStruct,在结构内部,我有一个大小为 3 的 innerStruct 数组。我想返回一个指向该数组的指针,这样我就可以分配一个本地指针来指向其中的一个元素以便稍后修改这些值。

在某种程度上,我的编译器似乎告诉我我正在返回一个 int 而不是 innerStruct * 类型。

我该如何正确地做到这一点? 需要双指针吗?

#include <stdio.h>

typedef struct
{
  int content;

} innerStruct;

typedef struct
{
  int a;
  innerStruct inner[3];

} myStruct;

static myStruct m1;

innerStruct * getMyStructPtr()
{
    return &(m1.inner);
}

int main()
{
    int id = 0;
    int elem = 1;
    /* Define a local ptr so I can modify values of the m1 struct */
    innerStruct * local_ptr = NULL;

    innerStruct * myStruct_ptr = getMyStructPtr(); // seems like my compiler tells me I'm returning an int instead of innerStruct * type

    /* Point to one of the elements */
    local_ptr = &myStruct_ptr[elem];

    local_ptr->content = 123;

    return 0;
}

在线代码编译器链接:https://onlinegdb.com/BJNO9lxA-

【问题讨论】:

  • 我希望它是静态分配的,而不是动态分配的。
  • 你只需要return m1.inner;
  • @KerrekSB 那不是返回innerStruct而不是innerStruct *吗?
  • 它为什么会做这样的事情? m1.inner 的类型是 innerStruct[3],而不是 innerStruct
  • @KerrekSB 我明白了。但我希望它返回一个指针。

标签: c pointers struct


【解决方案1】:

这样想:在使用数组的上下文中,它实际上相当于一个指针。例如,m1.inner 实际上可以用作指向 m1.inner[3] 中第一个元素的指针 innerStruct *

为了获得指向m1.inner 数组中任一元素的指针,您可以在从innerStruct * getMyStructPtr() 返回时执行以下操作。

  1. 获取指向第一个元素的指针:return m1.inner
  2. 要获得指向第二个元素的指针:return m1.inner + 1
  3. 获取指向第三个元素的指针:return m1.inner + 2

当然你应该选择不硬编码+ 1+ 2,而是将其作为参数传递,即

innerStruct * getMyStructPtr(int elementNo)//don't forget it is zero based
{
    return m1.inner + elementNo;
}

话虽如此,数组和指针之间当然存在一些差异。如果您仍然有点困惑为什么数组和指针在大多数情况下是可以互换的,请阅读this answer。作者做了非常详尽的解释。

【讨论】:

  • 所以返回m1.inner时不需要&amp;
  • 没有。 &amp;(m1.inner) 等价于 innerStruct **。这可能是您想要的,但是您需要将返回类型更改为innerStruct** getMyStructPtr()
【解决方案2】:

不带括号的数组名是指向数组中第一个元素的指针。函数应该是:

innerStruct* getMyStructPtr()
{
    return myStruct.inner;
}

如果您想访问特定元素,那么您需要:

return &myStruct.inner[2];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-30
    • 2018-10-20
    • 1970-01-01
    • 2014-08-26
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多