數據類型分爲4種, 簡單數據類型,構造數據類型,指針數據類型,空類型。html
結構體屬於構造數據類型,用struct標識。linux
|
struct st1 { int a; int b; }; 1 對成員賦值. 1.1 用{}形式. struct st1 st1 = {1,2,3); //定義並初始化結構體變量 1.2 linux kernel風格. struct st1 st1 = { //定義並初始化結構體變量 .a = 1; .b = 2; }; 2 對總體賦值. struct st1 a, b; //聲明結構體變量 b = a; //結構體直接賦值 3 結構體做爲函數返回值對另外一個結構體賦值. struct st1 func1(); struct st1 a = func1();
struct A{
char v1[20];
int v2;
} a,b;
a = b;
這沒有任何問題.
可是:
struct B{
char *v1;
int v2;
} c,d;
c = d;
這種結構體賦值,就須要注意(包括在C++裏)。
對於指針賦值,即不是數據進行了複製保存而是多了一個指針指向而已,這樣一旦b對象釋放,a的指向就成了非法的垃圾數據。
因此在c中,自定義類型、數組都是要另外本身定義複製函數的,這主要是代碼安全考慮,而不是語言層面考慮。
#include <stdio.h> //也能夠這樣: typedef struct st1 { int e1; int e2; }ST_MY; //1.定義結構體類型的時候,裏面是分號,定義完畢後要加分號。 ST_MY func1() { ST_MY h = { 77, 88}; return h; } int main() { ST_MY a = { 33, 44}; // 2.定義並初始化一個結構體 ST_MY b = { .e1 = 55, //3.0 定義並初始化一個結構體時,能夠點賦值 }; //3.1 點賦值只能是初始化結構體變量時才能用 ST_MY c; ST_MY d, e; c = a;//4.結構體直接賦值(方法1) d = func1();//5.結構體直接賦值(方法2) e.e2=77; //6.聲明以後爲一個結構體變量賦值效果.不一樣於定義並初始化一個結構體變量。 printf("a.e1 a.e2 is %d %d\n", a.e1, a.e2); printf("b.e1 b.e2 is %d %d\n", b.e1, b.e2); printf("c.e1 c.e2 is %d %d\n", c.e1, c.e2); printf("d.e1 d.e2 is %d %d\n", d.e1, d.e2); printf("e.e1 e.e2 is %d %d\n", e.e1, e.e2); f1(); return 0; } /* root@oucaijun:/work/dcc# gcc *.c; ./a.out a.e1 a.e2 is 33 44 b.e1 b.e2 is 55 0 c.e1 c.e2 is 33 44 d.e1 d.e2 is 77 88 e.e1 e.e2 is -1074143256 77 //6.聲明以後爲一個結構體變量賦值效果.不一樣於定義並初始化一個結構體變量。
*/
從詞條上解釋能夠看出二等公民與一等公民在權利上是有差異的,這個詞頗有意思做爲計算機專業術語,其含義也有殊途同歸之妙!一樣咱們看看維基百科對計算機的術語」first-class citizen"(一等公民)的定義,通常要知足如下幾點,
對比着上面的定義來看C語言數組,
以下面的操做就是非法的: int a[10];
至於爲何數組必須是二等公民,這是有歷史緣由的,你們能夠參考C 語言的發展史來看,有時間這塊內容我再補上!
源文檔 <http://www.cnblogs.com/hazir/p/C_struct_assignment.html> |