很抱歉,如果之前已经提出这个问题,但我对传入并为结构分配值感到困惑。
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);
}
答案 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
包含first
中main
变量的地址。
因此,当您在*test
中分配给func
时,您实际上正在first
分配给main
。这就是为什么你可以看到函数之外的结果。
因此,此代码将按预期工作,尽管它不是最佳的。正如在另一个答案中所提到的,而是将值分配给结构的本地实例,然后将其分配给解除引用的指针,您可以简单地取消引用指针并直接写入每个字段。
void func(test_t * test)
{
test->x = 2;
test->y = 3;
}