首頁  >  問答  >  主體

c++ - 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这种东西,今天才知道可以直接用=号,求教一下各位。

天蓬老师天蓬老师2767 天前529

全部回覆(4)我來回復

  • PHP中文网

    PHP中文网2017-04-17 12:05:25

    C語言

    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

    C++

    在C++中,struct和class的作用相同,都是用來定義類,差別只在於結構體內預設存取權限是public,而class定義的private;
    而定義類別的時候,c++編譯器會為每個類別自動加上預設建構函式、拷貝建構函式、以及賦值操作函式oprerator=
    而透過=號操作時,

    a = b;

    既:

    a.operator=(b);
    

    operator=()函數內的實作細節為:對於基本型,直接拷貝;對於自訂類型,呼叫拷貝建構函式拷貝;

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 12:05:25

    結構體不是指針,所以可以直接賦值,而數組是指針,所以不行,我是這樣認為的

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 12:05:25

    結構體是一坨一坨的,賦值的時候是整坨賦過去的(底層也是memcoy)

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 12:05:25

    直接用等於的話,太耗內存了,結構體指針更好一點吧。

    回覆
    0
  • 取消回覆