C語言筆記-結構體的初始化

一般程式常看到這種結構的初始化方式:

direction_s upright={NULL,0,1,1,0};


direction_s upright={NULL,0,1,1,0};

這種填充式的結構初始化很糟糕,因為必須要記住所有的結構成員順序,這種方式很不人性化

初始化應該使用上標籤:


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

typedef struct{
 int one;
 double two,three,four;
}n_str;
n_str d={
 100,
 .four=10,
 .two=30,
 };
 
 
int main(void)
{
 printf("%d %g %g %g",d.one,d.two,d.three, d.four);
 
}




  • 從上面的程式碼中可以看到初始化結構成員,順序不用與聲明的一致,編譯器也是可以成功編譯
  • 未聲明的原素初始化為0,沒有初始過的都是設為0
  • 可以混和聲明

在"21 century c"中有這個範例可以參考:

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

typedef struct{
 char *name;
 int left,right,up,down;
}direction_s;

void this_row(direction_s d);
void draw_box(direction_s d);



int main(void)
{
 direction_s D={.name="left",.left=1};
 draw_box(D);
 
 D=(direction_s){"upper right",.up=1,.right=1};
 draw_box(D);
 
 draw_box((direction_s){});

 
 return 0;
}

void this_row(direction_s d){
 printf(d.left?"*..\n"
   : d.right?"..*\n"
   : ".*.\n"
   );
}


void draw_box(direction_s d){
 printf("%s:\n",(d.name?d.name:"a box"));
 d.up    ?this_row(d):printf("...\n");
 (!d.up && !d.down) ?this_row(d):printf("...\n");
 d.down    ?this_row(d):printf("...\n");
 printf("\n");
}



不用帶標籤的初始化方式是恐怖的:


D.left=1;
D.right=0;
D.up=1;

這種初始化也要改成

Direction_s D={.left=1,.up=1};<br />
這樣才是應該提倡的
---------------------------------------------------------------------


要預設結構體的原素自動設為0,可以透過賦予一個全空ˇ空白值來達成:


n_str d={};

輸出出來看值都為0。



固定長度的陣列也是這樣聲明就可以將陣列值設為0,但是在可變長度的陣列就只能使用memset()來達成目的了。












留言

這個網誌中的熱門文章

FreeRTOS學習筆記 (二)-任務創建和刪除(xTaskCreate及vTaskDelete)

FreeRTOS學習筆記 (三)-時間管理vTaskDelay()及vTaskDelayUntil()

C語言筆記-文本處理(1) 善用 asprintf取代sprintf