簡體   English   中英

使用單指針或雙指針將指針返回到結構體數組

[英]Returning pointer to an array of struct with single or double pointer

我的代碼的目標如下:

  1. 通過單指針或雙指針返回指向innerStruct數組的指針(我相信我應該使用雙指針)

  2. 將該指針傳遞給修改值的函數

似乎在在線編譯器中出現段錯誤。

#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

由於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;
}

這是您正在做的事情的第二種切入點。 除了分配外,還可以將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

由您決定是否要為innerStruct中的3 innerStruct myStruct ,但從我對您要執行的操作的閱讀中(不包括stdlib.h ,看來您的意圖是處理數組而不分配。 如果您還有其他問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM