在C中复制带引用的结构

在C中复制带引用的结构,c,struct,structure,C,Struct,Structure,我想从另一个结构复制一个结构,如下所示: #include <stdio.h> #include <stdlib.h> struct foo_struct{ int foo; char *str; }; static void foo(struct foo_struct *, struct foo_struct *); void main(void) { int i; struct foo_struct *test = malloc(

我想从另一个结构复制一个结构,如下所示:

#include <stdio.h>
#include <stdlib.h>


struct foo_struct{
    int foo;
    char *str;
};

static void foo(struct foo_struct *, struct foo_struct *);
void main(void) {
    int i;
    struct foo_struct *test = malloc(sizeof(struct foo_struct) * 5);
    struct foo_struct *cpy_struct = NULL;

    foo(test, cpy_struct);

    cpy_struct->foo = 20;
    //printf("%d\n", cpy_struct.foo);

    free(test);
}

static void foo(struct foo_struct *test, struct foo_struct *cpy){
    int i;
    for(i = 0; i < 5; i++)
        test[i].foo = i;    

    cpy = &test[2];
}
如何复制此结构以更新特定结构中的值


谢谢。

对于第二种情况,您需要确定分配顺序。当前代码将测试[2]复制到cpy_结构,然后将其修改为20。输出为20。考虑下面的

struct foo_struct cpy_struct = {0};

cpy_struct.foo = 20;

foo(test, &cpy_struct);

printf("%d\n", cpy_struct.foo); /* Display 2 */
printf("%d\n", test[2].foo);    /* Display 2 */

对于第二种情况,您需要确定分配顺序。当前代码将测试[2]复制到cpy_结构,然后将其修改为20。输出为20。考虑下面的

struct foo_struct cpy_struct = {0};

cpy_struct.foo = 20;

foo(test, &cpy_struct);

printf("%d\n", cpy_struct.foo); /* Display 2 */
printf("%d\n", test[2].foo);    /* Display 2 */

在第一个程序中,必须通过引用传递指针

比如说

static void foo(struct foo_struct *test, struct foo_struct **cpy){
    int i;
    for(i = 0; i < 5; i++)
        test[i].foo = i;    

    *cpy = test + 2;
}
在这种情况下,main中的指针
cpy_struct
将指向test指向的数组的第三个元素


在第二个程序中,您创建了结构类型的新对象,并将
test+2
指向的对象复制到其中。因此,您有一个单独的对象。

在第一个程序中,您必须通过引用传递指针

比如说

static void foo(struct foo_struct *test, struct foo_struct **cpy){
    int i;
    for(i = 0; i < 5; i++)
        test[i].foo = i;    

    *cpy = test + 2;
}
在这种情况下,main中的指针
cpy_struct
将指向test指向的数组的第三个元素

在第二个程序中,您创建了结构类型的新对象,并将
test+2
指向的对象复制到其中。因此,您有一个单独的对象。

对于您的第一个案例

#include <stdio.h>
#include <stdlib.h>


struct foo_struct{
    int foo;
    char *str;
};

static void foo(struct foo_struct *, struct foo_struct **);
void main(void) {
    int i;
    struct foo_struct *test = malloc(sizeof(struct foo_struct) * 5);
    struct foo_struct *cpy_struct = NULL;

    foo(test, &cpy_struct);

    //cpy_struct->foo = 20;
    printf("%d\n", cpy_struct->foo);

    free(test);
}

static void foo(struct foo_struct *test, struct foo_struct **cpy){
    int i;
    for(i = 0; i < 5; i++)
        test[i].foo = i;    

    *cpy = &test[2];
}
#包括
#包括
结构foo_结构{
int foo;
char*str;
};
静态void foo(struct foo_struct*,struct foo_struct**);
真空总管(真空){
int i;
struct foo_struct*test=malloc(sizeof(struct foo_struct)*5);
struct foo_struct*cpy_struct=NULL;
foo(测试和cpy_结构);
//cpy_struct->foo=20;
printf(“%d\n”,cpy\u struct->foo);
免费(测试);
}
静态void foo(struct foo_struct*测试,struct foo_struct**cpy){
int i;
对于(i=0;i<5;i++)
测试[i].foo=i;
*cpy=&测试[2];
}
您所做的是将test[2]的地址指定为cpy_struct的值。 您需要做的是将test[2]的地址分配给cpy_struct的地址

要做到这一点,必须将foo的参数作为指向指针的指针,这样当您将某物赋值给*cpy时,它将赋值给cpy_struct的地址,而不是它的值

我已经更正了代码,并对其进行了测试。printf结果是2,因为我注释掉了cpy_struct->foo=20的赋值

你的第一个病例

#include <stdio.h>
#include <stdlib.h>


struct foo_struct{
    int foo;
    char *str;
};

static void foo(struct foo_struct *, struct foo_struct **);
void main(void) {
    int i;
    struct foo_struct *test = malloc(sizeof(struct foo_struct) * 5);
    struct foo_struct *cpy_struct = NULL;

    foo(test, &cpy_struct);

    //cpy_struct->foo = 20;
    printf("%d\n", cpy_struct->foo);

    free(test);
}

static void foo(struct foo_struct *test, struct foo_struct **cpy){
    int i;
    for(i = 0; i < 5; i++)
        test[i].foo = i;    

    *cpy = &test[2];
}
#包括
#包括
结构foo_结构{
int foo;
char*str;
};
静态void foo(struct foo_struct*,struct foo_struct**);
真空总管(真空){
int i;
struct foo_struct*test=malloc(sizeof(struct foo_struct)*5);
struct foo_struct*cpy_struct=NULL;
foo(测试和cpy_结构);
//cpy_struct->foo=20;
printf(“%d\n”,cpy\u struct->foo);
免费(测试);
}
静态void foo(struct foo_struct*测试,struct foo_struct**cpy){
int i;
对于(i=0;i<5;i++)
测试[i].foo=i;
*cpy=&测试[2];
}
您所做的是将test[2]的地址指定为cpy_struct的值。 您需要做的是将test[2]的地址分配给cpy_struct的地址

要做到这一点,必须将foo的参数作为指向指针的指针,这样当您将某物赋值给*cpy时,它将赋值给cpy_struct的地址,而不是它的值


我已经更正了代码,并对其进行了测试。printf结果是2,因为我注释掉了cpy_struct->foo=20的赋值

谢谢你,我从来没有用过指针对指针。。。 我正在尝试使用以下代码:

static void foo(struct foo_struct *, struct foo_struct **);
void main(void) {
    int i;
    struct foo_struct *test = malloc(sizeof(struct foo_struct) * 5);
    struct foo_struct *cpy_struct = NULL;

    foo(test, &cpy_struct);

    cpy_struct->foo = 20;
    printf("%d\n", cpy_struct->foo); /* Display 20 */
    printf("%d\n", test[2].foo);     /* Display 20 */

    free(test);
}

static void foo(struct foo_struct *test, struct foo_struct **cpy){
    int i;
    for(i = 0; i < 5; i++)
        test[i].foo = i;    

    *cpy = &test[2];
}
静态void foo(struct foo_struct*,struct foo_struct**);
真空总管(真空){
int i;
struct foo_struct*test=malloc(sizeof(struct foo_struct)*5);
struct foo_struct*cpy_struct=NULL;
foo(测试和cpy_结构);
cpy_struct->foo=20;
printf(“%d\n”,cpy_struct->foo);/*显示20*/
printf(“%d\n”,test[2].foo);/*Display 20*/
免费(测试);
}
静态void foo(struct foo_struct*测试,struct foo_struct**cpy){
int i;
对于(i=0;i<5;i++)
测试[i].foo=i;
*cpy=&测试[2];
}

谢谢,我从来没有用过指针指向指针。。。
我正在尝试使用以下代码:

static void foo(struct foo_struct *, struct foo_struct **);
void main(void) {
    int i;
    struct foo_struct *test = malloc(sizeof(struct foo_struct) * 5);
    struct foo_struct *cpy_struct = NULL;

    foo(test, &cpy_struct);

    cpy_struct->foo = 20;
    printf("%d\n", cpy_struct->foo); /* Display 20 */
    printf("%d\n", test[2].foo);     /* Display 20 */

    free(test);
}

static void foo(struct foo_struct *test, struct foo_struct **cpy){
    int i;
    for(i = 0; i < 5; i++)
        test[i].foo = i;    

    *cpy = &test[2];
}
静态void foo(struct foo_struct*,struct foo_struct**);
真空总管(真空){
int i;
struct foo_struct*test=malloc(sizeof(struct foo_struct)*5);
struct foo_struct*cpy_struct=NULL;
foo(测试和cpy_结构);
cpy_struct->foo=20;
printf(“%d\n”,cpy_struct->foo);/*显示20*/
printf(“%d\n”,test[2].foo);/*Display 20*/
免费(测试);
}
静态void foo(struct foo_struct*测试,struct foo_struct**cpy){
int i;
对于(i=0;i<5;i++)
测试[i].foo=i;
*cpy=&测试[2];
}

您需要将
cpy\u struct
的地址传递给
foo()
并在该函数中更新
cpy
,如
*cpy=&test[2]
。在您的情况下,函数中更新的
cpy
中的值在
foo()
返回时丢失。您需要将
cpy\u struct的地址传递到
foo()
并在该函数中更新
cpy
,如
*cpy=&test[2]
。在您的例子中,函数中更新的
cpy
中的值在
foo()
返回时丢失谢谢,但是,当我想要cpy\u结构条目时,我想修改
test[2]。foo
,在第二种情况下,不可能。谢谢,但是,当我想要cpy\u结构条目时,我想修改
test[2].foo
,在第二种情况下是不可能的。