亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁(yè)| 資源下載| 資源專輯| 精品軟件
登錄| 注冊(cè)

您現(xiàn)在的位置是:首頁(yè) > 技術(shù)閱讀 >  C語(yǔ)言的柔性數(shù)組,可能你聽過(guò),但未實(shí)際用過(guò)

C語(yǔ)言的柔性數(shù)組,可能你聽過(guò),但未實(shí)際用過(guò)

時(shí)間:2024-06-01

文章目錄

  • 語(yǔ)法形式

  • 特性

  • 如何使用

  • 特性驗(yàn)證

  • 我在項(xiàng)目中的使用

  • 總結(jié)


點(diǎn)擊下方閱讀原文可訪問(wèn)文中超鏈接


引用外網(wǎng)的一段內(nèi)容(原文鏈接):


Flexible Array Member(FAM) is a feature introduced in the C99 standard of the C programming language.

  • For the structures in C programming language from C99 standard onwards, we can declare an array without a dimension and whose size is flexible in nature.

  • Such an array inside the structure should preferably be declared as the last member of structure and its size is variable(can be changed be at runtime).

  • The structure must contain at least one more named member in addition to the flexible array member.

有可能你之前也聽說(shuō)過(guò)柔性數(shù)組,但還并未在項(xiàng)目中實(shí)際用過(guò),剛好我最近做一個(gè)項(xiàng)目就用到了柔性數(shù)組,或許可以給你一些啟發(fā)。
柔性數(shù)組是C99標(biāo)準(zhǔn)引入的特性,所以當(dāng)你的編譯器提示不支持的語(yǔ)法時(shí),請(qǐng)檢查你是否開啟了C99選項(xiàng)或更高的版本支持。

語(yǔ)法形式

struct vectord {
short len; // 必須至少有一個(gè)其它成員
char arr[]; // 柔性數(shù)組必須是結(jié)構(gòu)體最后一個(gè)成員(也可是其它類型,如:int、double、...)
};

特性

  • sizeof計(jì)算結(jié)構(gòu)體大小時(shí),柔性數(shù)組成員是不計(jì)入結(jié)果的。即:

// 假設(shè)short類型占用兩個(gè)字節(jié)
結(jié)構(gòu)體大小 = sizeof(struct vectord) = 2 + 0;
  • 整個(gè)結(jié)構(gòu)體的內(nèi)存空間是連續(xù)的。

如何使用

定義成結(jié)構(gòu)體變量。如果定義成變量的話,那么柔性數(shù)組是操作不了的,因?yàn)闊o(wú)法為其分配內(nèi)存,強(qiáng)行訪問(wèn)的話會(huì)產(chǎn)生段錯(cuò)誤。

struct vectord vec;

定義成結(jié)構(gòu)體指針。這才是正確操作。

struct vectord *pvec;

// 分配內(nèi)存(假設(shè)需要一個(gè)20個(gè)元素的數(shù)組)
pvec = malloc(sizeof(struct vectord) + 20 * sizeof(*pvec->arr));

特性驗(yàn)證

先來(lái)看第一個(gè)特性,使用如下的代碼測(cè)試結(jié)構(gòu)體的大小。

struct vectord {
short len;
char arr[];
};

int main(int argc,char *argv[])
{
printf("The size of structure is:%ld\r\n",sizeof(struct vectord));

return 0;
}

測(cè)試結(jié)果,柔性數(shù)組確實(shí)沒(méi)有參與計(jì)算:

The size of structure is:2

下面驗(yàn)證第二個(gè)特性。這里與結(jié)構(gòu)體內(nèi)嵌指針的形式進(jìn)行對(duì)比。

struct vectord {
short len;
char arr[];
};

struct test {
short len;
char *p;
};

int main(int argc,char *argv[])
{
struct vectord *pvec;
struct test *pt;

pvec = malloc(sizeof(struct vectord) + 20);
pt = malloc(sizeof(struct test));
pt->p = malloc(20);

printf("%p,%p\r\n",&pvec->len,&pvec->arr);
printf("%p,%p\r\n",&pt->len,&pt->p);

return 0;
}

測(cè)試結(jié)果,包含柔性數(shù)組成員的結(jié)構(gòu)體內(nèi)存確實(shí)是連續(xù)的,而內(nèi)嵌指針的方式卻不一定:

0x560511a0f670,0x560511a0f672
0x560511a0f690,0x560511a0f698

我在項(xiàng)目中的使用

項(xiàng)目需求是串口1接收到一幀數(shù)據(jù)(不定長(zhǎng))之后,我需要在這幀數(shù)據(jù)的前面再封裝進(jìn)一幀數(shù)據(jù),然后將組成的一幀新的數(shù)據(jù)通過(guò)串口2再發(fā)出去。即:

串口1->1234567
|
V
組幀->abcdefg1234567
|
V
abcdefg1234567->串口2

這里有以下常用的方法:

  • 直接分兩次發(fā)送,調(diào)用兩次串口發(fā)送函數(shù)就行了。

  • 定義一個(gè)大數(shù)組,將兩幀合并后再發(fā)送。

  • 暫時(shí)想不到還有什么其它好方法。

上面兩種方法都可以實(shí)現(xiàn),第一種需要調(diào)用兩次串口發(fā)送函數(shù),第二種則是空間置換,都不是很好的方案。
這個(gè)時(shí)候柔性數(shù)組就派上用場(chǎng)了,根據(jù)其特性,內(nèi)存是動(dòng)態(tài)的可按需分配,不會(huì)額外浪費(fèi)空間,而且其內(nèi)存空間是連續(xù)的,所以可以像數(shù)組一樣通過(guò)下標(biāo)訪問(wèn);這兩個(gè)特性剛好就可以將上面兩種方案的優(yōu)點(diǎn)結(jié)合到一起。所以可以使用如下的方案:

#pragma pack(1)
struct vectord {
uint16_t packet_len;
char buffer1[4];
char buffer2[];
};
#pragma pack()

void uart2_send(uint8_t *data,uint32_t len);

int main(int argc,char *argv[])
{
struct vectord *pvec;

pvec = malloc(sizeof(struct vectord) + 4);

// 模擬組幀
pvec->packet_len = 2 + 4 + 4;
strncpy(pvec->buffer1,"abcd",4);
strncpy(pvec->buffer2,"1234",4);

// 模擬硬件串口的發(fā)送
uart2_send((uint8_t *)pvec,pvec->packet_len);

return 0;
}

void uart2_send(uint8_t *data,uint32_t len)
{
uint32_t i = 0;

printf("%02x %02x ",data[1],data[0]);
i += 2;

for(;i < len;i++)
{
printf("%c",data[i]);
}
printf("\r\n");
}

測(cè)試結(jié)果:

00 0a abcd1234

總結(jié)

柔性數(shù)組還有很多適合使用的場(chǎng)合,我這里只是其中一種,只要符合其特性的都可以采用柔性數(shù)組來(lái)完成。善于利用各種語(yǔ)法特性,可以將復(fù)雜的代碼簡(jiǎn)單化,也更能檢測(cè)自己是否已經(jīng)掌握了其真正的用法。

亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜在线视频| 在线免费观看成人网| 亚洲免费影视| 欧美一区二区在线播放| 亚洲欧美激情一区二区| 久久男女视频| 欧美日韩亚洲91| 国产亚洲人成网站在线观看| 亚洲国产日本| 亚洲小说欧美另类婷婷| 欧美在线观看网址综合| 欧美激情综合五月色丁香| 国产精品男人爽免费视频1| 在线观看日韩av电影| 亚洲麻豆av| 久久久久这里只有精品| 国产精品一区二区女厕厕| 日韩视频一区二区三区在线播放| 久久成人一区二区| 国产精品自在在线| 亚洲男女毛片无遮挡| 欧美日韩国产天堂| 亚洲国产乱码最新视频| 久久综合九色九九| 精品999成人| 久久久一本精品99久久精品66| 国产欧美日韩视频一区二区三区| 日韩图片一区| 欧美电影打屁股sp| 亚洲狠狠婷婷| 欧美精品www在线观看| 亚洲三级性片| 欧美日韩三级电影在线| 一本色道88久久加勒比精品| 欧美日韩黄色一区二区| 亚洲精品美女| 欧美极品一区| 一本一本a久久| 国产精品国产三级国产| 亚洲一区日韩在线| 国产精品一区二区久久精品| 亚洲欧美一区二区激情| 国产日韩综合| 久久综合久久综合久久| 亚洲高清免费视频| 欧美日韩在线电影| 亚洲手机成人高清视频| 国产精品福利网站| 亚洲男人的天堂在线| 国产午夜亚洲精品羞羞网站| 欧美一区二区三区在线观看| 国产性猛交xxxx免费看久久| 麻豆精品视频| 亚洲国产精品国自产拍av秋霞 | 亚洲精品小视频在线观看| 欧美91福利在线观看| 影音先锋亚洲电影| 久久综合狠狠综合久久综青草| 在线观看欧美激情| 欧美日韩一区二区三区免费| 中文在线不卡| 国产欧美在线观看| 久久国产婷婷国产香蕉| 影音先锋另类| 国产精品高清在线| 美女黄毛**国产精品啪啪| 亚洲一区二区av电影| 国产伦精品一区二区三区高清版| 美国十次了思思久久精品导航| 亚洲人成亚洲人成在线观看| 国产精品jizz在线观看美国| 欧美一区二区免费观在线| 很黄很黄激情成人| 欧美三级电影一区| 久久人人爽人人爽爽久久| 亚洲精品视频在线播放| 欧美三级电影一区| 免费成人网www| 亚洲一区二区三区在线| 136国产福利精品导航| 欧美激情亚洲综合一区| 亚洲男人第一网站| 亚洲美女诱惑| 亚洲第一精品在线| 国产亚洲aⅴaaaaaa毛片| 欧美日韩在线精品| 欧美成人免费观看| 美女精品一区| 久久婷婷国产麻豆91天堂| 欧美一区二区三区在线观看视频| 这里只有视频精品| 亚洲久久视频| 亚洲精品乱码久久久久久久久 | 久久久久国产成人精品亚洲午夜| 亚洲精品小视频| 黄色亚洲免费| 国内精品久久久久久久影视麻豆 | 国产欧美一区二区精品仙草咪 | 国产精品免费看久久久香蕉| 欧美日韩精品二区第二页| 免费在线一区二区| 欧美亚洲一区在线| 午夜精品久久久久久久久久久久 | 老司机精品视频一区二区三区| 亚洲综合999| 亚洲在线网站| 亚洲欧美久久久久一区二区三区| 亚洲美女诱惑| 亚洲视频专区在线| 亚洲综合精品四区| 午夜日韩激情| 亚洲欧美资源在线| 欧美在线免费观看| 久久蜜桃资源一区二区老牛 | 夜夜嗨av一区二区三区中文字幕| 亚洲精品国产精品国自产观看浪潮 | 亚洲国产清纯| 日韩视频一区二区| 一区二区三欧美| 亚洲欧美成人一区二区在线电影 | 在线欧美福利| 亚洲黄页视频免费观看| 99综合在线| 性欧美长视频| 久久综合影音| 欧美日韩成人一区| 国产精品羞羞答答xxdd| 伊人久久大香线蕉综合热线| 亚洲伦伦在线| 欧美一区二区三区喷汁尤物| 久久久综合视频| 欧美伦理a级免费电影| 国产精品免费一区二区三区观看| 国产亚洲一区在线| 亚洲国产精品成人一区二区| 日韩午夜在线电影| 亚洲综合国产精品| 美女精品网站| 国产精品日韩专区| 亚洲国产欧美久久| 亚洲摸下面视频| 免费在线国产精品| 国产精品久久久久久久午夜| 精品99一区二区三区| 中国成人在线视频| 免费亚洲一区二区| 国产精品国产精品| 91久久精品日日躁夜夜躁欧美| 亚洲欧美中文日韩在线| 欧美激情一区二区三区蜜桃视频| 国产精品亚洲综合久久| 91久久精品网| 麻豆久久久9性大片| 国产精品午夜视频| 亚洲人体一区| 久久亚洲免费| 国产精品午夜春色av| 日韩视频一区二区三区在线播放免费观看 | 尤物yw午夜国产精品视频明星| 最新日韩欧美| 久久综合给合久久狠狠色| 国产精品日韩二区| 99re热精品| 中文精品一区二区三区| 欧美不卡在线| 国产在线精品自拍| 一区二区三区四区国产| 欧美国产日韩一区二区三区| 国产一区二区三区在线观看免费视频 | 国产在线日韩| 9色精品在线| 欧美日本亚洲韩国国产| 亚洲国产日韩欧美| 久久国产日韩| 国产又爽又黄的激情精品视频| 亚洲专区在线| 国产精品网站视频| 欧美亚洲免费| 国产精品一区二区你懂得| 亚洲女性喷水在线观看一区| 欧美性感一类影片在线播放| 国产精品99久久久久久久久久久久| 欧美日本一区| 亚洲午夜久久久久久久久电影网| 欧美日韩精品二区| 亚洲精品激情| 欧美三级中文字幕在线观看| 在线一区二区三区做爰视频网站| 欧美日韩免费一区二区三区视频| 亚洲另类自拍| 国产精品高精视频免费| 性欧美办公室18xxxxhd| 国产日韩精品电影| 久久久综合精品| 亚洲国产日韩欧美| 欧美日韩一本到| 亚洲欧美日韩高清| 国产亚洲精品资源在线26u| 欧美在线视频全部完| 亚洲福利视频一区|