如何通过双指针访问结构中的结构成员?

时间:2015-09-11 18:48:39

标签: c visual-studio-2012

作为学校作业的一部分,我得到一个结构,其中有一个双指针指向其中的另一个结构。我需要能够在函数中访问嵌套结构的成员,但我没有运气这样做。

这是我给出的代码

UTF8

这是我的尝试:

#include<stdio.h>
#include <stdlib.h>
/*Given code, do not change */

typedef struct
{
    char* ID;
    char* PassWord;
}Account, *pAccount, **ppAccount;

typedef struct
{
    unsigned int numAccounts;
    ppAccount accounts;
}FleaBay,*pFleaBay;

void FleaBayInit(pFleaBay);             /* Initialise the FleaBay instance */

int main(void)
{

    FleaBay e;
    FleaBayInit(&e); /* Call to the function */

    return 0;
}
/* end of given code */

我在访问非嵌套void FleaBayInit(FleaBay *pFleaBay){ /* Initialise the FleaBay instance */ Account ac1 = {"test1", "test2"}, *pac1 = &ac1; pFleaBay ->numAccounts = 0; pFleaBay ->accounts = &pac1; } 中的成员时没有遇到任何问题,但我无法弄清楚如何访问嵌套struct结构的成员。以为我可能需要首先创建一个Account对象,指向它,并将指针的值分配给Account内的accounts成员,但是当我使用{{进行测试时1}},我得到一些随机字符。

2 个答案:

答案 0 :(得分:4)

在结构中

typedef struct
{
    char* ID;
    char* PassWord;
}Account, *pAccount, **ppAccount;

ppAccount是指向指针的指针,指针通常用于表示动态指针数组。

在第二个结构中

typedef struct
{
    unsigned int numAccounts;
    ppAccount accounts;
}FleaBay,*pFleaBay;

您拥有帐户的数量,这将是动态数组中元素的数量。因此,在您的代码中,您可以使用语法pFleaBay->accounts[n]访问其中一个帐户。这意味着您希望使用malloccalloc在函数中分配指针数组。

pFleaBay->accounts = calloc(pFleaBay->numAccounts, sizeof(pAccount));

然后您可以分配每个帐户。

答案 1 :(得分:4)

FleaBayInit()中,ac1本地变量pac1被初始化为指向ac1的指针。作为局部变量,ac1的生命周期仅限于一个函数调用。函数返回后,ac1不再存在,并且指向它的任何指针都变为无效。

此外,FleaBay.accountsAccount **,但您尝试为其分配Account *pac1)。当函数返回时,该指针不仅变得无效,它甚至不是正确的类型。这实际上很奇怪;我没有看到FleaBay.accounts不应该只是Account *的原因。

已编辑添加:

第二个想法,FleaBay.accounts可能是Account **,因为它意味着指向Account *的动态数组,而不是动态数组Account。这将提供一些优势,特别是如果Account个对象必须独立于FleaBay

在这种情况下,初始化FleaBay的最简单方法可能是:

void FleaBayInit(FleaBay *pFleaBay){ /* Initialise the FleaBay instance */
    pFleaBay->numAccounts = 0;
    pFleaBay->accounts = NULL;
}

然而,这是否合适取决于您打算如何实现操纵FleaBay的其他代码 - 尤其是添加或删除帐户的代码。