4

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

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

4 回答 4

3

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

struct test *testPtr;

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

&testPtr;

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

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

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

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

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

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

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

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

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

编辑:正如 eric 所指出的,n=5;func1(). 我认为您的意思*n=5可能是某种调试步骤...您可能的意思是n用作函数的输入来说明结构数组中需要多少对象。要么初始化,要么n重新定义func1()

void func1(int n,struct test **testobj) // n is no longer a poitner, just a number
于 2013-06-25T12:57:58.627 回答
0

在声明步骤本身中创建指向结构的指针数组,然后将其传递给函数

struct test *testobj[10];
func1(&n,testobj);

这会将整个指针数组传递给函数

于 2013-06-25T12:54:53.953 回答
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);
}
于 2013-06-25T13:02:22.103 回答
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);
}
于 2013-06-25T13:16:49.167 回答