似乎合法,请参见此处-
如何将结构成员作为指针传递给函数
如果您想自己确定,您可以编译并查看汇编代码,您会看到编译器将直接地址传递给给定元素,而不会从其中“复制”任何内容。
例如这段代码:
typedef struct {
int a;
int b;
int c;
} T;
void set(int* c) {
*c = 0;
}
int main()
{
T t;
set(&(t.b));
set(&(t.c));
return 0;
}
构建(使用 gcc 4.2.2,-O2),并使用 objdump 反汇编,主函数给出:
0000000000400500 <main>:
400500: 53 push %rbx
400501: 48 83 ec 10 sub $0x10,%rsp //"allocates" t on the stack
400505: 48 8d 7c 24 04 lea 0x4(%rsp),%rdi //creates a direct pointer the t.b
40050a: e8 e1 ff ff ff callq 4004f0 <set>
40050f: 48 8d 7c 24 08 lea 0x8(%rsp),%rdi //creates a direct pointer the t.c
400514: e8 d7 ff ff ff callq 4004f0 <set>
400519: 8b 44 24 04 mov 0x4(%rsp),%eax
40051d: 03 44 24 08 add 0x8(%rsp),%eax
400521: 48 83 c4 10 add $0x10,%rsp
400525: 5b pop %rbx
400526: c3 retq
00000000004004f0 <set>:
4004f0: c7 07 00 00 00 00 movl $0x0,(%rdi)
4004f6: c3 retq
因此,修改函数将直接写入定义的原始结构,当然,除非在某些时候您确实创建了它的副本(这是一个常见的错误,例如通过创建 T t2 = t)