欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

數(shù)組的使用方法有哪些

這篇文章主要講解了“數(shù)組的使用方法有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“數(shù)組的使用方法有哪些”吧!

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、信州網(wǎng)絡(luò)推廣、小程序定制開(kāi)發(fā)、信州網(wǎng)絡(luò)營(yíng)銷、信州企業(yè)策劃、信州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供信州建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:chinadenli.net

先看下面的代碼,對(duì)于包含動(dòng)態(tài)字符串成員的兩個(gè)結(jié)構(gòu)體Test0和Test1占用空間分別是多少呢?

//來(lái)源:公眾號(hào)【編程珠璣】  //作者:守望先生  #include<stdio.h>  struct Test0  {      int a;      int b;      char *c;  };  struct Test1  {      int a;      int b;      char c[];  };  int main(void)  {      printf("sizeof(struct Test0) = %zd\n",sizeof(struct Test0));      printf("sizeof(struct Test1) = %zd\n",sizeof(struct Test1));      return 0;  }

很多讀者一眼就能看出來(lái),在64位系統(tǒng)上,編譯為64位程序,其輸出結(jié)果為:

16  8

對(duì)于Test0的結(jié)果是16,通常沒(méi)有什么疑問(wèn),畢竟4(int)+4(int)+8(指針)= 16,但是對(duì)于后者的結(jié)構(gòu)體占用空間為8字節(jié),有的讀者可能會(huì)有疑問(wèn)。(關(guān)于字節(jié)對(duì)齊,參考《字節(jié)對(duì)齊,看這篇就懂了》)

柔性數(shù)組(flexible array)

實(shí)際上這是在C99中引入的柔性數(shù)組的特性。即結(jié)構(gòu)體的最后一個(gè)成員,可以不完整類型(一種缺乏足夠的信息去描述一個(gè)完整對(duì)象的類型)的數(shù)組,但它使得整個(gè)結(jié)構(gòu)體的大小就像沒(méi)有這個(gè)成員一樣。但是呢,當(dāng)用結(jié)構(gòu)體通過(guò)這個(gè)名字訪問(wèn)這個(gè)成員時(shí),就像訪問(wèn)一個(gè)普通數(shù)組成員一樣。

如果數(shù)組最終一個(gè)元素都沒(méi)有的話,那么訪問(wèn)這個(gè)數(shù)組將會(huì)是未定義行為了。

正如我們前面所看到的:

struct Test1  {      int a;      int b;      char c[];  };

成員c是一個(gè)數(shù)組,但是并沒(méi)有指定大小,使用sizeof計(jì)算Test1,其占用空間也僅僅是8字節(jié)。

有什么好處?

那么使用柔性數(shù)組有什么好處呢?

內(nèi)存申請(qǐng)和釋放

假設(shè)分別使用兩種類型的結(jié)構(gòu)體,存儲(chǔ)16字節(jié)的字符數(shù)據(jù),需要申請(qǐng)內(nèi)存。對(duì)于struct Test0:

strcut Test0 *t0 = malloc(sizeof(struct Test0));//為結(jié)構(gòu)體申請(qǐng)內(nèi)存  t0->c = malloc(sizeof(char) * 16);//為成員指向的數(shù)據(jù)申請(qǐng)內(nèi)存

而對(duì)于struct Test1:

strcut Test1 *t1 = malloc(sizeof(struct Test1) + sizeof(char) * 16);

看出區(qū)別了嗎?前者需要兩次內(nèi)存申請(qǐng),而后者只需要一次。前者地址不連續(xù)(兩次malloc),后者地址連續(xù)。而你訪問(wèn)成員c的時(shí)候,只需要下面這樣就可以:

t1->c,和普通成員無(wú)異。

要判斷它們的地址是否連續(xù)也非常簡(jiǎn)單,只需要分別打印b和c的地址就可以了。

和內(nèi)存釋放類似,前面需要單獨(dú)釋放成員c申請(qǐng)的內(nèi)存,而后者可以一起釋放。

數(shù)據(jù)拷貝

正由于前面的差別,導(dǎo)致數(shù)據(jù)拷貝時(shí),更有區(qū)別。

對(duì)于struct Test0:

//memcpy(t0copy,t0,sizeof(struct Test0));//不可,這樣直接t0copy的c和t0的c指向同一片內(nèi)存區(qū)域。  t0t0copy.a = t0.a;  t0t0copy.b = t0.b;  memcpy(t0copy.c,t0.c,sizeof(char)*16);

這里無(wú)法一次拷貝,因?yàn)樗某蓡Tc是一個(gè)指針類型,我們需要的是一份完整拷貝,因此必須拷貝它指向的內(nèi)存。(參考《結(jié)構(gòu)體成員賦值到底是深拷貝還是淺拷貝?》)

但是對(duì)于struct Test1:

memcpy(t0copy,t0,sizeof(strcut Test1) + sizeof(char) * 16);

在這里,由于柔性數(shù)組的內(nèi)存,它的數(shù)據(jù)內(nèi)容和結(jié)構(gòu)體數(shù)據(jù)成員的地址是連續(xù)的,因此可以直接拷貝。

減少內(nèi)存碎片

由于結(jié)構(gòu)體的柔性數(shù)組和結(jié)構(gòu)體成員的地址是連續(xù)的,即可一同申請(qǐng)內(nèi)存,因此更大程度地避免了內(nèi)存碎片。另外由于該成員本身不占結(jié)構(gòu)體空間,因此,整體而言,比普通的數(shù)組成員占用空間要會(huì)稍微小點(diǎn)。

零長(zhǎng)數(shù)組

與柔性數(shù)組功能類似,還有一個(gè)0長(zhǎng)數(shù)組,不過(guò)它并不是標(biāo)準(zhǔn)中的,但是它可以實(shí)現(xiàn)類似的功能,使用方式如下:

struct Test1  {      int a;      int b;      char c[0];  };

差別在于使得數(shù)組長(zhǎng)度為0。但是由于它并非C標(biāo)準(zhǔn)中的,因此從可移植性考慮,不建議使用這種方式,除非你還無(wú)法使用C99。

感謝各位的閱讀,以上就是“數(shù)組的使用方法有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)數(shù)組的使用方法有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站標(biāo)題:數(shù)組的使用方法有哪些
網(wǎng)頁(yè)鏈接:http://chinadenli.net/article40/gioseo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣企業(yè)建站、網(wǎng)站建設(shè)商城網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)