返回指向带有单指针或双指针的struct数组的指针

时间:2017-10-31 21:16:26

标签: c arrays pointers

我的代码的目标如下:

  1. 通过单指针或双指针返回指向innerStruct数组的指针(我相信我应该使用双指针)

  2. 将该指针传递给修改值

  3. 的函数

    似乎我在在线编译器中遇到了一个seg错误。

    #include <stdio.h>
    
    typedef struct
    {
        int innerVal;
    
    } innerStruct;
    
    typedef struct
    {
        int           a;
        innerStruct * inner[3];
    
    } myStruct;
    
    static myStruct * m1;
    
    innerStruct ** getInnerPtrToArray()
    {
        return &(m1->inner);
    }
    
    void processInnerStruct(innerStruct * array_ptr[])
    {
        for(int i=0; i<3; i++)
        {
            array_ptr[i]->innerVal = i;
        }
    }
    
    int main() 
    {
        innerStruct ** array_ptr = getInnerPtrToArray();
        processInnerStruct(array_ptr);
    
        return 0;
    }
    

    在线编译器:https://onlinegdb.com/r1z0DPICb

2 个答案:

答案 0 :(得分:1)

由于inner是一个指针数组,因此需要为它们指定内存以指向它们。您还需要为m1分配内存以指向。

int main() 
{
    m1 = malloc(sizeof(myStruct));
    for (int i = 0; i < 3; i++) {
        m1->inner[i] = malloc(sizeof(innerStruct));
    }
    innerStruct ** array_ptr = getInnerPtrToArray();
    processInnerStruct(array_ptr);

    return 0;
}

答案 1 :(得分:1)

这是你正在做的第二次削减。您也可以将myStruct更改为仅包含innerStruct数组,而不是指向innerStruct 的指针数组,而不是分配。然后不需要分配,例如

#define NINNER 3    /* if you need a constant, define one */
...
typedef struct {
    int           a;
    innerStruct inner[NINNER];   /* you are not allocating */
} myStruct;

注意:避免使用全局变量,不需要它们。在main()中声明变量并根据需要传递参数。

完全放入,根据需要调整类型,并在下面添加注释作为评论,您可以执行以下操作:

#include <stdio.h>

#define NINNER 3    /* if you need a constant, define one */

typedef struct {
    int innerVal;
} innerStruct;

typedef struct {
    int a;
    innerStruct inner[NINNER];   /* you are not allocating */
} myStruct;

/* takes pointer to m1, returns address of array of 3 innerStruct */
innerStruct *getInnerPtrToArray (myStruct *innerptr)
{
    return innerptr->inner;
}

/* takes pointer to array of innerStruct, fills */
void processInnerStruct (innerStruct *array_ptr)
{
    for (int i = 0; i < NINNER; i++)
        array_ptr[i].innerVal = i;
}

int main (void) {

    myStruct m1 = { .a = 10 };  /* don't use globals */
    /* pass the address of m1 */
    innerStruct *array_ptr = getInnerPtrToArray (&m1);
    processInnerStruct (array_ptr);

    printf ("m1.a: %d\n", m1.a);        /* output values */
    for (int i = 0; i < NINNER; i++)
        printf ("  .inner[%d]: %d\n", i, m1.inner[i].innerVal);

    return 0;
}

示例使用/输出

$ ./bin/inner
m1.a: 10
  .inner[0]: 0
  .inner[1]: 1
  .inner[2]: 2

由您决定是否打算为3中的每个innerStruct myStruct分配,而是根据我对您尝试做的内容的分析,并且不包括stdlib.h,看来你的意图是在没有分配的情况下处理数组。如果您还有其他问题,请与我们联系。