gpt4 book ai didi

c - 通过引用获取功能修改结构

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:09 25 4
gpt4 key购买 nike

我想将结构 a 分配给结构 b。在函数调用之前和之后打印数组的地址和值表明在函数调用期间赋值有效并且两个指针都指向相同的结构地址。但是,从函数返回后,更改将被逆转。为什么?

typedef struct arrayA {
int a[3];
}arrayA;

void f(arrayA *a, arrayA *b){
a = b;
printf("address of a: %p\n", a);
printf("address of b: %p\n", b);
}

int main(int argc, char *argv[]) {
printf("------------ Array assignment test -----------------\n");
arrayA a = { { 0, 0, 0} };
arrayA b = { { 1, 1, 1} };
printf("address of a: %p\n", &a);
printf("address of b: %p\n", &b);
printf("a[0] : %d a[1] : %d\n", a.a[0], a.a[1]);
f(&a, &b);
printf("a[0] : %d a[1] : %d\n", a.a[0], a.a[1]);
printf("address of a: %p\n", &a);
printf("address of b: %p\n", &b);
printf("----------------------------------------------------\n");

return 0;
}

打印

 ------------ Array assignment test -----------------
address of a: 0x7ffd3fc17b80
address of b: 0x7ffd3fc17b90
a[0] : 0 a[1] : 0
address of a: 0x7ffd3fc17b90
address of b: 0x7ffd3fc17b90
a[0] : 0 a[1] : 0
address of a: 0x7ffd3fc17b80
address of b: 0x7ffd3fc17b90
----------------------------------------------------

最佳答案

您正在按值传递指针并期望它们被修改。它们将在函数内被修改,因为存在函数本地指针(地址)的副本。当函数返回时,原件保持不变。 (您可以尝试打印函数内局部变量的地址以更好地理解。)

如果你想改变结构,你会想要解引用指针:

void f(arrayA *a, arrayA *b){
*a = *b;
printf("address of a: %p\n", a);
printf("address of b: %p\n", b);
}

如果你想改变指针本身,你需要一个额外的间接:

void f(arrayA **a, arrayA **b){ // Note the ** here
*a = *b;
printf("address of a: %p\n", a);
printf("address of b: %p\n", b);
}

关于c - 通过引用获取功能修改结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41685797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com