作为学校作业的一部分,我得到一个结构,其中有一个双指针指向其中的另一个结构。我需要能够在函数中访问嵌套结构的成员,但我没有运气这样做。
这是我给出的代码
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}},我得到一些随机字符。
答案 0 :(得分:4)
在结构中
typedef struct
{
char* ID;
char* PassWord;
}Account, *pAccount, **ppAccount;
ppAccount
是指向指针的指针,指针通常用于表示动态指针数组。
在第二个结构中
typedef struct
{
unsigned int numAccounts;
ppAccount accounts;
}FleaBay,*pFleaBay;
您拥有帐户的数量,这将是动态数组中元素的数量。因此,在您的代码中,您可以使用语法pFleaBay->accounts[n]
访问其中一个帐户。这意味着您希望使用malloc
或calloc
在函数中分配指针数组。
pFleaBay->accounts = calloc(pFleaBay->numAccounts, sizeof(pAccount));
然后您可以分配每个帐户。
答案 1 :(得分:4)
在FleaBayInit()
中,ac1
是本地变量,pac1
被初始化为指向ac1
的指针。作为局部变量,ac1
的生命周期仅限于一个函数调用。函数返回后,ac1
不再存在,并且指向它的任何指针都变为无效。
此外,FleaBay.accounts
是Account **
,但您尝试为其分配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
的其他代码 - 尤其是添加或删除帐户的代码。