c - 返回指向静态定义的结构数组的指针

标签 c pointers struct

我静态定义了一个 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-

最佳答案

这样想:在您使用数组的上下文中,它实际上相当于一个指针。例如,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一读。作者做了非常详尽的解释。

关于c - 返回指向静态定义的结构数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46965629/

相关文章:

c - 复制到void *指针

c - 从函数到主函数使用字符串

c++ - 将字符串文字转换为 char 数组实际上在 C++ 中如何工作?

c++ - 如果我在另一个类中使用一个类的对象,我可以使用指向第一类对象的指针来指向它的成员吗?

c - 使用另一个 char 数组从 struct 设置一个 char 数组

go - 将结构的字段 slice 为可变参数

我可以假设 C stdlib 函数不使用 errno 吗?

C - 计算时间的gettimeofday?

c - 尝试复制数组的内容

c - 删除列表C中的奇数