1. 程式人生 > >對於結構體變數賦值的誤區

對於結構體變數賦值的誤區

以前在使用結構體時沒有在結構體變數之間直接賦值,今天同事在檢視別人的程式碼時,發現有兩個結構體變數直接賦值的語句當時感覺這個語句不對,認為在一個結構體裡邊,既有一般的無符號整形與陣列,因為陣列的賦值是不能直接賦值,要記憶體拷貝,從這裡推理所以認為這個語句不對。於是問了一下,我當時以為是結構體指標變數的賦值,認為沒有問題。還和同事爭論了一番,當他讓我看原始碼時,發現是變數間的直接賦值,下意識中的判斷是不對,原因就和之前他理解的一樣。 於是晚上到住處在網上查了一下,說是可以的,因為是同樣的資料型別,而C語言在相同型別的變數間賦值時是直接記憶體複製的,即將他們的記憶體進行復制,這裡因為同樣結構體變數,屬於同一種變數,所以賦值時是按照他們的記憶體分佈來直接拷貝的。
同時敲了一段很簡單的程式碼測試一下,看到底是為什麼。發現確實是這樣。那麼C語言在變數間的賦值是如何進行的呢? 再查詢發現在C中一個變數名其實就是一個地址對應著一塊記憶體的起始地址,賦值操作符就是找到這塊記憶體的起始地址。 網上一個關於結構體變數複製的帖子 #include <stdio.h>

typedef struct
{
     unsigned char a;
     unsigned char b;
     unsigned char c;
     unsigned char d[10];
}TestStruct;

int main(void)
{
     TestStruct a = {0};
     TestStruct b = {0};

     a.a = 1;
     a.b = 2;
     a.c = 3;
     a.d[2] = 5;

     b = a;

     printf("a.a:%d \n a.b:%d \n a.c:%d \n a.d[2]:%d \n", a.a, a.b, a.c, a.d[2]);

     printf("b.a:%d \n b.b:%d \n b.c %d \n b.d[2]:%d \n", b.a, b.b, b.c, b.d[2]);

     return 0;

}