gpt4 book ai didi

c - 了解如何动态创建结构数组并访问其元素

转载 作者:太空狗 更新时间:2023-10-29 15:36:04 26 4
gpt4 key购买 nike

我需要将指向结构的指针的地址传递给一个函数,该函数会动态地为结构数组分配内存并填充值。

现在从我的调用方法中,一旦我从 func1 返回,我应该能够遍历结构数组并显示结构变量的值。

有人能解释一下如何将指针的地址传递给结构,同时遍历动态创建的结构数组吗?

我的示例代码如下所示:

struct test {
int a;
int b;
};

void func1(int *n,struct test **testobj)

{
n=5;
*testobj = (struct test*) malloc(n*sizeof(struct test));
for(i=0;i<n;i++)
{
(*testobj)[i].a=1;
(*testobj)[i].b=2;
}
}

int main()
{
struct test testobj;int n;
func1(&n,&testobj);
for(i=0;i<n;i++)
{
printf("%d %d",(*testobj)[i].a,*testobj)[i].b);
}
free(testobj);
}

最佳答案

在 main() 中定义一个指向 test 结构的指针:

struct test *testPtr;

要获取该指针的地址,请使用 & address-of 运算符:

&testPtr;

这将返回指针的地址并具有类型 struct test **

然后您可以将其传递给您的函数 func1,它会进行正确的分配(尽管转换 malloc() 通常被认为是不好的做法 - Do I cast the result of malloc?)。除此之外,func1() 看起来还不错……这条线……

*testobj = malloc(n*sizeof(struct test));

...是正确的。 *testobj 取消引用您通过执行 &testPtr 获得的双指针,并将新内存的地址存储在您的指针中。当您使用 (*testobj)[i] 取消引用双指针时,您也是正确的,因为 [] 的优先级高于您需要的 *以(正如您正确完成的那样)用方括号括起取消引用,以确保在您获取索引之前发生这种情况。

因此,当 func1() 返回指针时 testPtr 现在应该指向 n test 的数组您分配的结构,可以使用 testPtr[i].a 等访问。

编辑:你的 for 循环应该变成

for(i=0;i<n;i++)
printf("%d %d", testobj[i].a, testobj[i].b);

你原来的 for 循环应该给你编译错误?在原始代码中 testobj 不是一个指针,因此应该不可能取消引用它。

所以总结答案是在 main() 中将 testobj 声明为一个指针 然后访问数组元素作为 testobj[ n] :)

编辑:正如 eric 所指出的,从 func1() 中删除 n=5;。我想你的意思是 *n=5 也许是某种调试步骤......你可能是想使用 n 作为函数的输入来说明你有多少对象想要在你的结构数组中。初始化 n 或者重新定义 func1()

void func1(int n,struct test **testobj) // n is no longer a poitner, just a number

关于c - 了解如何动态创建结构数组并访问其元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17297852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com