将结构传递给函数并赋值给它

时间:2017-10-10 02:21:18

标签: c pointers struct

很抱歉,如果之前已经提出这个问题,但我对传入并为结构分配值感到困惑。

typedef struct test {
    int x;
    int y;
} test_t;

void func(test_t * test)
{
    test_t second;
    second.x = 2;
    second.y = 3;

    *test = second;
 }

void main()
{
    test_t first;
    func(&first);
}

这有效吗?如果我没记错,没有在func()中对结构进行malloc,你不应该在func()中将指针* test分配给结构,因为它的范围主要在func()内部,并且一旦返回函数就会丢失。但是,在main()中打印出来时,这些值是正确的。

实现这一结果的不同方法有哪些?这只是为了消除一些困惑和忘记记忆。

编辑:

我正在尝试做的更明确的例子是:

typedef struct args
{
    int status;
    int id;
    unsigned long long start_address;
    unsigned long long end_address;
    unsigned long long size;
} args_t;

void ioctl_call(args_t *args)
{
    args_t params;

    /* get values */
    ioctl(fd, cmd, params);

    *args = params;
}

void main()
{
    args_t args;
    iotcl_call(&args);
    printf("%d\n", args.id);
}

2 个答案:

答案 0 :(得分:4)

void func(test_t * test)
{
    test_t second;
    second.x = 2;
    second.y = 3;

    *test = second;
 }

此代码完全有效,但不是最佳。

返回 second地址是违法的,但这不是正在发生的事情。当您说*test = second时,您将second分配给解除引用的指针。编译器将生成代码以复制结构的每个元素

它不理想的原因是因为该副本。相反,请考虑一下:

void func(test_t * test)
{
    test->x = 2;
    test->y = 3;
 }

通过这种方式,编译器将直接分配到指向结构的字段。

答案 1 :(得分:0)

参数test是函数func的本地参数,并且在函数外部看不到更改其值。

但是,您没有更改test的值。您解除引用它指向的内存位置并写入该位置。在这种情况下,test包含firstmain变量的地址。

因此,当您在*test中分配给func时,您实际上正在first分配给main。这就是为什么你可以看到函数之外的结果。

因此,此代码将按预期工作,尽管它不是最佳的。正如在另一个答案中所提到的,而是将值分配给结构的本地实例,然后将其分配给解除引用的指针,您可以简单地取消引用指针并直接写入每个字段。

void func(test_t * test)
{
    test->x = 2;
    test->y = 3;
 }