中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

數組的使用方法有哪些

這篇文章主要講解了“數組的使用方法有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“數組的使用方法有哪些”吧!

成都創新互聯公司專注為客戶提供全方位的互聯網綜合服務,包含不限于成都做網站、成都網站制作、成都外貿網站建設、信州網絡推廣、小程序定制開發、信州網絡營銷、信州企業策劃、信州品牌公關、搜索引擎seo、人物專訪、企業宣傳片、企業代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創新互聯公司為所有大學生創業者提供信州建站搭建服務,24小時服務熱線:18982081108,官方網址:www.2m8n56k.cn

先看下面的代碼,對于包含動態字符串成員的兩個結構體Test0和Test1占用空間分別是多少呢?

//來源:公眾號【編程珠璣】  //作者:守望先生  #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;  }

很多讀者一眼就能看出來,在64位系統上,編譯為64位程序,其輸出結果為:

16  8

對于Test0的結果是16,通常沒有什么疑問,畢竟4(int)+4(int)+8(指針)= 16,但是對于后者的結構體占用空間為8字節,有的讀者可能會有疑問。(關于字節對齊,參考《字節對齊,看這篇就懂了》)

柔性數組(flexible array)

實際上這是在C99中引入的柔性數組的特性。即結構體的最后一個成員,可以不完整類型(一種缺乏足夠的信息去描述一個完整對象的類型)的數組,但它使得整個結構體的大小就像沒有這個成員一樣。但是呢,當用結構體通過這個名字訪問這個成員時,就像訪問一個普通數組成員一樣。

如果數組最終一個元素都沒有的話,那么訪問這個數組將會是未定義行為了。

正如我們前面所看到的:

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

成員c是一個數組,但是并沒有指定大小,使用sizeof計算Test1,其占用空間也僅僅是8字節。

有什么好處?

那么使用柔性數組有什么好處呢?

內存申請和釋放

假設分別使用兩種類型的結構體,存儲16字節的字符數據,需要申請內存。對于struct Test0:

strcut Test0 *t0 = malloc(sizeof(struct Test0));//為結構體申請內存  t0->c = malloc(sizeof(char) * 16);//為成員指向的數據申請內存

而對于struct Test1:

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

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

t1->c,和普通成員無異。

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

和內存釋放類似,前面需要單獨釋放成員c申請的內存,而后者可以一起釋放。

數據拷貝

正由于前面的差別,導致數據拷貝時,更有區別。

對于struct Test0:

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

這里無法一次拷貝,因為它的成員c是一個指針類型,我們需要的是一份完整拷貝,因此必須拷貝它指向的內存。(參考《結構體成員賦值到底是深拷貝還是淺拷貝?》)

但是對于struct Test1:

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

在這里,由于柔性數組的內存,它的數據內容和結構體數據成員的地址是連續的,因此可以直接拷貝。

減少內存碎片

由于結構體的柔性數組和結構體成員的地址是連續的,即可一同申請內存,因此更大程度地避免了內存碎片。另外由于該成員本身不占結構體空間,因此,整體而言,比普通的數組成員占用空間要會稍微小點。

零長數組

與柔性數組功能類似,還有一個0長數組,不過它并不是標準中的,但是它可以實現類似的功能,使用方式如下:

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

差別在于使得數組長度為0。但是由于它并非C標準中的,因此從可移植性考慮,不建議使用這種方式,除非你還無法使用C99。

感謝各位的閱讀,以上就是“數組的使用方法有哪些”的內容了,經過本文的學習后,相信大家對數組的使用方法有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!

網站標題:數組的使用方法有哪些
網頁鏈接:http://www.2m8n56k.cn/article40/gioseo.html

成都網站建設公司_創新互聯,為您提供手機網站建設全網營銷推廣企業建站網站建設商城網站網頁設計公司

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設
主站蜘蛛池模板: 欧美成人免费在线观看 | 九九视频在线观看视频6偷拍 | 亚洲在线观看视频 | 九九热久久免费视频 | 国产欧美在线一区二区三区 | 欧美a在线看 | 亚洲 欧美 中文字幕 | 久久精品国产免费高清 | 久久国产精品自线拍免费 | 超91在线 | 欧美一区二区视频在线观看 | 黄网站色成年小说系列 | 欧美xxxwww | 黄色在线不卡 | 怡红院在线a男人的天堂 | 亚洲成年人网址 | 国产一级高清视频 | 久久久99精品免费观看精品 | 一级毛片儿 | 亚洲人成在线免费观看 | 一区二区三区日本视频 | 国产亚洲亚洲精品777 | 欧美午夜成年片在线观看 | 欧美一区二区三区视频在线 | 国产午夜三区视频在线 | 欧美丰满大乳大屁股毛片 | 青草九九 | 久久精品久久久 | 久久久9视频在线观看 | 国产啪精品视频网免费 | 久久精品国产一区二区三区日韩 | 亚洲国产伦理 | 99精品国产成人一区二区 | 一区二区三区四区视频在线观看 | 亚洲一区二区在线视频 | 香蕉网站狼人久久五月亭亭 | 欧美特级午夜一区二区三区 | 99久久99久久精品免费看子伦 | 66精品| 久久国产精品最新一区 | 国产日产久久高清欧美一区 |