开发者社区> 问答> 正文

c语言结构体可以通过等号复制么?

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

struct test
{
    int a[5];
};


void print_test(struct test* a, const char* msg)
{
    int i;
    printf("%s:\t", msg);
    for (i = 0; i < 5; ++i)
        printf("%d ", a->a[i]);
    printf("\n");
}


void reset(struct test* input, int start)
{
    int i;
    struct test tmp;
    for (i = 0; i < 5; ++i)
        tmp.a[i] = start + i;

    *input = tmp;
}

int main()
{
    struct test r1, r2, r3;
    int i;
    for (i = 0; i < 5; ++i) {
        r1.a[i] = i;
        r2.a[i] = i + 20;
        r3.a[i] = i + 40;
    }

    print_test(&r1, "r1");
    print_test(&r2, "r2");
    print_test(&r3, "r3");

    r1 = r2;
    r2 = r3;
    reset(&r3, 80);

    print_test(&r1, "r1");
    print_test(&r2, "r2");
    print_test(&r3, "r3");

    return(0);
}

我以前一直以为结构体复制需要用memcpy这种东西,今天才知道可以直接用=号,求教一下各位。

展开
收起
a123456678 2016-06-08 16:05:10 3337 0
1 条回答
写回答
取消 提交回答
  • 码农|Coder| Pythonista

    C语言中,结构体是一篇连续的内存空间,使用=赋值操作,底层用到的就是memcpy;
    如果结构体中有指针变量;操作后。两个指针指向的同一块区域,而不会分配新的区域;

    struct S
    {
        int a;
        char * b;
    };
    
    
    int main(){
    
        S s1;
        s1.b = new char[5];
        memcpy(s1.b,"hell",5);
        
        S s2;
        s2 = s1;
        
        printf("s1.b:%s ,%d \n s2.b:%s,%d\n" ,s1.b,int(s1.b),s2.b,int(s2.b));
        return 0;
    }
    
    output://复制后的地址空间相同
    s1.b:hell ,4921176
    s2.b:hell,4921176
    2019-07-17 19:32:11
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载