我需要将指向结构的指针的地址传递给函数,该函数将动态地为结构数组分配内存并填充值。
现在从我的调用方法,一旦我从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);
}
答案 0 :(得分:3)
在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]
访问:)
编辑:正如埃里克指出的那样,从n=5;
移除func1()
。我认为你的意思是*n=5
或者作为某种调试步骤...你可能意味着使用n
作为函数的输入来说明你想在结构数组中有多少个对象。初始化n
或者可能重新定义func1()
为
void func1(int n,struct test **testobj) // n is no longer a poitner, just a number
答案 1 :(得分:0)
在声明步骤本身中创建指向结构的指针数组,并将其简单地传递给函数
struct test *testobj[10];
func1(&n,testobj);
这会将整个指针数组传递给函数
答案 2 :(得分:0)
您的代码对我来说非常好。 只编辑那应该没问题的是 -
取代
struct test testobj;
输入以下代码
struct test *testobj;
并保持剩余的原样..!
这是所需内容的工作版本,这里根据需要在被调用函数中分配内存
#include <stdlib.h>
#include <stdio.h>
struct tests {
int a;
int b;
};
void func1(int *n,struct tests **testobj)
{
int i;
*n=5;
*testobj = (struct tests*) malloc((*n)*sizeof(struct tests));
for(i=0;i<(*n);i++)
{
(*testobj)[i].a=1;
(*testobj)[i].b=2;
}
}
int main()
{
int i;
struct tests *testobj;int n;
func1(&n,&testobj);
for(i=0;i<(n);i++)
{
printf("%d %d",(testobj)[i].a,testobj[i].b);
}
free(testobj);
}
答案 3 :(得分:0)
我们并不完全清楚您要求的版本,但其中一个应该涵盖它:
/* allocate some number of tests.
*
* out_n: out parameter with array count
* returns: an array of tests
*/
struct test* allocate_some_tests(int *out_n) {
int n = 5; /* hardcoded, random or otherwise unknown to caller */
*out_n = n
struct test *t = malloc(n * sizeof(*t));
while (n--) {
t[n].a = 1;
t[n].b = 2;
}
return t;
}
/* allocate a specific number of tests.
*
* n: in parameter with desired array count
* returns: an array of tests
*/
struct test* allocate_n_tests(int n) {
struct test *t = malloc(n * sizeof(*t));
while (n--) {
t[n].a = 1;
t[n].b = 2;
}
return t;
}
请注意,您只需返回已分配的数组,此处不需要指向指针。
至于调用它们,并迭代结果:
void print_tests(struct test *t, int n) {
for (; n--; t++)
printf("{%d, %d}\n", t->a, t->b);
}
int main()
{
int count1; /* I don't know how many yet */
struct test *array1 = allocate_some_tests(&count1);
print_tests(array1, count1);
int count2 = 3; /* I choose the number */
struct test *array2 = allocate_n_tests(count2);
print_tests(array2, count2);
}