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

时间:2013-06-25 12:51:20

标签: c pointers structure

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

现在从我的调用方法,一旦我从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);
}

4 个答案:

答案 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);
}