【问题标题】:How to access the members of a struct within a struct via a double pointer?如何通过双指针访问结构内的结构成员?
【发布时间】:2015-09-11 18:48:39
【问题描述】:

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

这是我得到的代码

#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 对象,指向它,然后将指针的值分配给pFleaBay 中的accounts 成员,但是当我使用printf("%s",pFleaBay-&gt;accounts); 进行测试时,我得到了一些随机字符。

【问题讨论】:

  • 你的程序的其他部分是否有malloc 内存?
  • 不,不在任何地方做 malloc。程序的其他部分不相关。
  • 看起来ppAccount 应该是一个数组。
  • 你能详细说明一下吗?
  • @Jason 指针数组?

标签: c visual-studio-2012


【解决方案1】:

在结构中

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

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

在第二个结构中

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

您有帐户的数量,即动态数组中元素的数量。因此,在您的代码中,您可以使用语法pFleaBay-&gt;accounts[n] 访问其中一个帐户。这意味着您需要使用malloccalloc 在函数中分配一个指针数组。

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

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

【讨论】:

    【解决方案2】:

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

    此外,FleaBay.accountsAccount **,但您尝试为其分配 Account * (pac1)。该指针不仅在函数返回时变得无效,甚至不是正确的类型。这实际上很奇怪。我看不出FleaBay.accounts 不应该只是Account * 的任何理由。


    编辑添加:

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

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

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

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


    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 2021-12-11
      • 2013-05-25
      相关资源
      最近更新 更多