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

Modify struct via a reference taking function

我想将结构 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
----------------------------------------------------

However, after returning from the function the changes are reversed. Why?

你的f()函数实际上只是改变了它里面的指针,而那些指针的改变并没有保留在函数之后。

你可以通过pass-by-pointer复制结构:

void f(arrayA *a, arrayA *b){
    *a = *b; 
}

这将确保您可以通过

复制 main() 中的结构
f(&a, &b); 

因为你只需要复制结构,根本不需要打印出地址。如果您确实需要调试地址,您应该转换为 (void *) 以避免所有带有 printf("%p")

的警告

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

如果要更改结构,则需要取消引用指针:

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); 
}