c语言结构体数组怎么初始化,c语言结构体数组初始化

最近看一段代码有所迷惑,先简单总结一下。有关结构体数组初始化的问题

struct  _m_usmart_nametab usmart_nametab[]=

{

#if USMART_USE_WRFUNS==1 //如果使能了读写操作

(void*)read_addr,"u32 read_addr(u32 addr)",

(void*)write_addr,"void write_addr(u32 addr,u32 val)",

#endif

(void*)delay_ms,"void delay_ms(u16 nms)",

(void*)delay_us,"void delay_us(u32 nus)",

(void*)LCD_Clear,"void LCD_Clear(u16 Color)",

(void*)LCD_Fill,"void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)",

(void*)LCD_DrawLine,"void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)",

(void*)LCD_DrawRectangle,"void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)",

(void*)Draw_Circle,"void Draw_Circle(u16 x0,u16 y0,u8 r)",

(void*)LCD_ShowNum,"void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)",

(void*)LCD_ShowString,"void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)",

(void*)LCD_ReadPoint,"u16 LCD_ReadPoint(u16 x,u16 y)",

(void*)fsmc_sram_test_write,"void fsmc_sram_test_write(u8 data,u32 addr)",

(void*)fsmc_sram_test_read,"u8 fsmc_sram_test_read(u32 addr)",

(void*)mymalloc,"void *mymalloc(u8 memx,u32 size)",

(void*)myfree,"void myfree(u8 memx,void *ptr)",

(void*)mf_mount,"u8 mf_mount(u8 drv)",

(void*)mf_open,"u8 mf_open(u8*path,u8 mode)",

(void*)mf_close,"u8 mf_close(void)",

(void*)mf_read,"u8 mf_read(u16 len)",

(void*)mf_write,"u8 mf_write(u8*dat,u16 len)",

(void*)mf_opendir,"u8 mf_opendir(u8* path)",

(void*)mf_readdir,"u8 mf_readdir(void)",

(void*)mf_scan_files,"u8 mf_scan_files(u8 * path)",

(void*)mf_showfree,"u32 mf_showfree(u8 *drv)",

(void*)mf_lseek,"u8 mf_lseek(u32 offset)",

(void*)mf_tell,"u32 mf_tell(void)",

(void*)mf_size,"u32 mf_size(void)",

(void*)mf_mkdir,"u8 mf_mkdir(u8*pname)",

(void*)mf_fmkfs,"u8 mf_fmkfs(u8 drv,u8 mode,u16 au)",

(void*)mf_unlink,"u8 mf_unlink(u8 *pname)",

(void*)mf_rename,"u8 mf_rename(u8 *oldname,u8* newname)",

(void*)mf_gets,"void mf_gets(u16 size)",

(void*)mf_putc,"u8 mf_putc(u8 c)",

(void*)mf_puts,"u8 mf_puts(u8*c)",

};

_m_usmart_nametab的结构体如下

//函数名列表

struct _m_usmart_nametab

{

void* func; //函数指针

const u8* name; //函数名(查找串)

};

一开始一直不明白,为什么下边的只有两个参数,而上边的确有那么多,难道不是一一对应?

其实上边的是一个table表,就像 u8 table[]={};

而上边的定义的是一个结构体的数组,其成员很多。但每一个成员应该和结构体类型一致,这只不是定义一个这样结构类型的结构体数组而已。

看下面例子

typedef struct _TEST_T {

int i;

char c[10];

}TEST_T;

TEST_T gst = {1, “12345”};//可以初始化,设置i为1,s为一个字符串.

TEST_T gst = {1};//初始化个数少于实际个数时,只初始化前面的成员。

TEST_Tgst = {.c=“12345”};//有选择的初始化成员。

复合字面量。

gst = (TEST_T){122, "1256"};//这是一个赋值语句,也可以作为初始化。可以出现在程序的任何地方。

当然也可以使用复合字面量来初始化:

gst = (TEST_T){.i=122, .c="123"};

3、结构体数组

可以用多个大括号括起来:

TEST_T gst[10] = {{},{},{},{}}

也可以初始化其中的一个元素:

TEST_T gst[10] = {[2]={}, [3]={}}

也可以使用复合字面量:

TEST_T gst[10] = {[2].i=0, [3].i={}}

### C语言数组初始化赋值方法 #### 使用初始化列表进行数组初始化 在C语言中,可以通过初始化列表为数组赋予初始值。这种方式允许在声明数组的同时指定各个元素的具体数值。 ```c // 定义并初始化一个包含五个整数的数组 int numbers[5] = {1, 2, 3, 4, 5}; ``` 当提供的初始值少于数组的实际长度时,剩余未被显式初始化的部分会被自动设置为零[^1]。 #### 利用省略号语法简化大范围重复值的设定 对于较大规模的数组,在某些情况下可能希望快速填充特定区间内的多个位置相同的值。为此目的,可以采用带有省略号(`...`)特殊标记的方法: ```c #include <stdio.h> void main() { // 创建一个具有十个整形成员的数组,并对其部分区域统一设值 int arr[10] = {100, [1 ... 7] = 99, 98}; for(int i=0;i<10;++i){ printf("arr[%d]=%d ",i,arr[i]); } } ``` 上述代码片段展示了如何利用这种特性高效地完成复杂模式下的批量初始化操作[^4]。 #### 动态分配内存后的手动初始化 除了静态定义外,还可以借助`malloc()`函数动态获取所需空间后自行实施初始化过程;不过此时需额外调用诸如`memset()`之类的辅助工具来实现全量清零或其他形式的基础化处理[^5]。 ```c #include <string.h> #include <stdlib.h> char* str; if ((str=(char*)malloc(strlen(source)+1))!=NULL){ strcpy(str,source); // 复制字符串内容到新申请的空间内 }else{ fprintf(stderr,"Error allocating memory.\n"); } free(str); ``` 需要注意的是,虽然这里展示了一个字符指针的例子,但对于其他基本数据类型的数组同样适用类似的逻辑来进行后期配置工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值