C語(yǔ)言中長(zhǎng)度為0的數(shù)組詳解
概述
長(zhǎng)度為0的數(shù)組在標(biāo)準(zhǔn)c和c++中是不合法的,但是在gcc中是可行的。
長(zhǎng)度為0數(shù)組它的最典型的用法就是位于結(jié)構(gòu)體中的最后一項(xiàng)。
使用方式
如下面的例子,分別使用長(zhǎng)度為0的數(shù)組和指針聲明結(jié)構(gòu)體,實(shí)現(xiàn)可變長(zhǎng)度的數(shù)組功能:
#include <stdio.h> #include <stdlib.h> struct test1 { int a; int b[0]; }; struct test2 { int a; int *b; }; struct test3 { int a; int reserved;//占位符,64位系統(tǒng)中保證結(jié)構(gòu)體字節(jié)對(duì)齊,test2中是由編譯器對(duì)齊的,所以兩個(gè)結(jié)構(gòu)體占用空間相同 int *b; }; int main() { struct test1 *var1; struct test2 *var2; int iLength = 10; int i; printf("the length of struct test1:%d\n",sizeof(struct test1)); printf("the length of struct test2:%d\n",sizeof(struct test2)); printf("the length of struct test3:%d\n",sizeof(struct test3)); var1=(struct test1*)malloc(sizeof(struct test1) + sizeof(int) * iLength); var1->a=iLength; for(i=0; i < var1->a; i++) { var1->b[i]=i; printf("var1->b[%d]=%d\t", i, var1->b[i]); } printf("\n"); printf("p var1 = %p\n", var1); printf("p var1->a %p\n", &var1->a); printf("var1->b %p\n", var1->b); printf("p var1->b %p\n", &var1->b); printf("p var1->b[0] %p\n", &var1->b[0]); printf("p var1->b[1] %p\n", &var1->b[1]); printf("\n\n"); var2=(struct test2*)malloc(sizeof(struct test2)); var2->a=iLength; var2->b=(int *)malloc(sizeof(int) * iLength); for(i=0; i < var2->a; i++) { var2->b[i]=i; printf("var2->b[%d]=%d\t", i, var2->b[i]); } printf("\n"); printf("p var2 = %p\n", var2); printf("p var2->a %p\n", &var2->a); printf("var2->b %p\n", var2->b); printf("p var2->b %p\n", &var2->b); printf("p var2->b[0] %p\n", &var2->b[0]); printf("p var2->b[1] %p\n", &var2->b[1]); free(var1); free(var2->b); free(var2); return 0; }
64位linux系統(tǒng)中運(yùn)行結(jié)果
the length of struct test1:4 the length of struct test2:16 the length of struct test3:16 var1->b[0]=0 var1->b[1]=1 var1->b[2]=2 var1->b[3]=3 var1->b[4]=4 var1->b[5]=5 var1->b[6]=6 var1->b[7]=7 var1->b[8]=8 var1->b[9]=9 p var1 = 0x55eb1a7d7670 p var1->a 0x55eb1a7d7670 var1->b 0x55eb1a7d7674 p var1->b 0x55eb1a7d7674 p var1->b[0] 0x55eb1a7d7674 p var1->b[1] 0x55eb1a7d7678 var2->b[0]=0 var2->b[1]=1 var2->b[2]=2 var2->b[3]=3 var2->b[4]=4 var2->b[5]=5 var2->b[6]=6 var2->b[7]=7 var2->b[8]=8 var2->b[9]=9 p var2 = 0x55eb1a7d76b0 p var2->a 0x55eb1a7d76b0 var2->b 0x55eb1a7d76d0 p var2->b 0x55eb1a7d76b8 p var2->b[0] 0x55eb1a7d76d0 p var2->b[1] 0x55eb1a7d76d4
使用長(zhǎng)度為0的數(shù)組可以比指針更方便地進(jìn)行內(nèi)存的管理。
結(jié)構(gòu)體test1在分配內(nèi)存時(shí),則是采用一次分配的原則,一次性將所需的內(nèi)存全部分配給它,釋放也是一次釋放。數(shù)組和結(jié)構(gòu)體的內(nèi)存是連續(xù)的。
結(jié)構(gòu)體test2在分配內(nèi)存時(shí),需采用兩步:首先,需為結(jié)構(gòu)體分配一塊內(nèi)存空間;其次再為結(jié)構(gòu)體中的成員變量分配內(nèi)存空間。這樣兩次分配的內(nèi)存是不連續(xù)的,需要分別對(duì)其進(jìn)行管理。當(dāng)使用長(zhǎng)度為0的數(shù)組時(shí),則是采用一次分配的原則,一次性將所需的內(nèi)存全部分配給它。相反,釋放時(shí)也是一樣的。
總結(jié)
長(zhǎng)度為0的數(shù)組并不占有內(nèi)存空間,而指針?lè)绞叫枰加脙?nèi)存空間。
對(duì)于長(zhǎng)度為0的數(shù)組,在申請(qǐng)內(nèi)存空間時(shí),采用一次性分配的原則進(jìn)行;對(duì)于包含指針的結(jié)構(gòu)體,才申請(qǐng)空間時(shí)需分別進(jìn)行,釋放時(shí)也需分別釋放。
對(duì)于長(zhǎng)度為0的數(shù)組元素的訪問(wèn)可正常采用數(shù)組方式進(jìn)行。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
利用簡(jiǎn)潔的C語(yǔ)言代碼解決跳臺(tái)階問(wèn)題與約瑟夫環(huán)問(wèn)題
這篇文章主要介紹了利用簡(jiǎn)潔的C語(yǔ)言代碼解決跳臺(tái)階問(wèn)題與約瑟夫環(huán)問(wèn)題的方法,跳臺(tái)階問(wèn)題與約瑟夫環(huán)問(wèn)題是常見的基礎(chǔ)算法題目,需要的朋友可以參考下2016-02-02C語(yǔ)言圖書管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言圖書管理系統(tǒng)課程設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01探討C++中不能聲明為虛函數(shù)的有哪些函數(shù)
下面小編就為大家?guī)?lái)一篇探討C++中不能聲明為虛函數(shù)的有哪些函數(shù)。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2017-01-01