熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

"); //-->

博客專欄

EEPW首頁(yè) > 博客 > C語(yǔ)言中長(zhǎng)度為0的數(shù)組

C語(yǔ)言中長(zhǎng)度為0的數(shù)組

發(fā)布人:電子禪石 時(shí)間:2019-07-09 來(lái)源:工程師 發(fā)布文章

C語(yǔ)言中長(zhǎng)度為0的數(shù)組

 

 

前面在看Xen的源碼時(shí),遇到了一段代碼,如下所示:

1.png

注意上面最后一行的代碼,這里定義了一個(gè)長(zhǎng)度為的數(shù)組,這種用法可以嗎?為什么可以使用長(zhǎng)度為的數(shù)組?長(zhǎng)度為的數(shù)組到底怎么使用?……這篇文章主要針對(duì)該問(wèn)題進(jìn)行簡(jiǎn)單的講解。廢話不多說(shuō)了,現(xiàn)在就開始。

長(zhǎng)度為的數(shù)組在標(biāo)準(zhǔn)cc++中是不允許的,如果使用長(zhǎng)度為的數(shù)組,編譯時(shí)會(huì)產(chǎn)生錯(cuò)誤,提示數(shù)組長(zhǎng)度不能為。但在GNUc中,這種用法卻是合法的。它的最典型的用法就是位于數(shù)組中的最后一項(xiàng),如上面所示,這樣做主要是為了方便內(nèi)存緩沖區(qū)的管理。如果你將上面的長(zhǎng)度為的數(shù)組換為指針,那么在分配內(nèi)存時(shí),需采用兩步:首先,需為結(jié)構(gòu)體分配一塊內(nèi)存空間;其次再為結(jié)構(gòu)體中的成員變量分配內(nèi)存空間。這樣兩次分配的內(nèi)存是不連續(xù)的,需要分別對(duì)其進(jìn)行管理。當(dāng)使用長(zhǎng)度為的數(shù)組時(shí),則是采用一次分配的原則,一次性將所需的內(nèi)存全部分配給它。相反,釋放時(shí)也是一樣的。

對(duì)于長(zhǎng)度為的數(shù)組,在gcc手冊(cè)中,有如下一段代碼片段:

struct line {

    int length;

    char contents[0];

};

struct line *thisline = (struct line *) malloc(sizeof(struct line) + this_length);

 

thisline->length = this_length;

這段代碼的主要含義是定義了一個(gè)結(jié)構(gòu)體,并對(duì)其進(jìn)行初始化,上面結(jié)構(gòu)體的第二個(gè)成員變量contents[0]事實(shí)上是不占內(nèi)存空間的,因此整個(gè)結(jié)構(gòu)體的長(zhǎng)度sizeof(struct line)4。當(dāng)采用malloc為其申請(qǐng)內(nèi)存空間時(shí),如上所示,申請(qǐng)了一段長(zhǎng)度為結(jié)構(gòu)體長(zhǎng)度加可變長(zhǎng)度的內(nèi)存空間給結(jié)構(gòu)體類型的指針,這時(shí)contents就指向申請(qǐng)的可變長(zhǎng)度的內(nèi)存空間。由于是一次申請(qǐng)的,所以這段可變長(zhǎng)度的內(nèi)存空間和前面的結(jié)構(gòu)體長(zhǎng)度的內(nèi)存空間是連續(xù)的。對(duì)于這段可變長(zhǎng)度的內(nèi)存空間,可以采用數(shù)組的方式對(duì)其進(jìn)行訪問(wèn)。對(duì)于整個(gè)結(jié)構(gòu)體,當(dāng)不再使用時(shí),可以使用free函數(shù)一次性對(duì)其進(jìn)行釋放,而不必像指針那樣分別釋放。

 

下面舉例進(jìn)行說(shuō)明:

#include <stdio.h>

#include <stdlib.h>#define LENGTH 10

struct test1 {

    int a;

    int *b;

}__attribute((packed));

struct test2 {

    int a;

    int b[0];

}__attribute((packed));

struct test3 {

    int a;

    int b[1];

}__attribute((packed));

int main() {

    struct test1 *var1;

    struct test2 *var2;

    struct test3 *var3;

    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));

    var1->a = 1;

    var1->b = (int *) malloc(sizeof(int));

    *var1->b = 1;

    printf("\nvar1->a=%d,*(var1->b)=%d\n", var1->a, *var1->b);

 

    var2 = (struct test2*) malloc(sizeof(struct test2) + sizeof(int) * LENGTH);

    var2->a = 2;

    printf("\nvar2->a=%d\n", var2->a);

    for (i = 0; i < LENGTH; i++) {

        var2->b[i] = i;

        printf("var2->b[i]=%d\t", var2->b[i]);

    }

    printf("\n\n");

 

    var3 = (struct test3*) malloc(sizeof(struct test3));

    var3->a = 3;

    (var3->b)[0] = 3;

    printf("var3->a=%d,(var3->b)[0]=%d\n", var3->a, (var3->b)[0]);

 

    free(var1->b);

    free(var1);

    free(var2);

    free(var3);

 

}

這段程序的運(yùn)行結(jié)果如下圖所示:

2.png

從上面的結(jié)果可以看出:

1、 長(zhǎng)度為的數(shù)組并不占有內(nèi)存空間,而指針?lè)绞叫枰加脙?nèi)存空間。

2、對(duì)于長(zhǎng)度為數(shù)組,在申請(qǐng)內(nèi)存空間時(shí),采用一次性分配的原則進(jìn)行;對(duì)于包含指針的結(jié)構(gòu)體,才申請(qǐng)空間時(shí)需分別進(jìn)行,釋放時(shí)也需分別釋放。

3、 對(duì)于長(zhǎng)度為的數(shù)組的訪問(wèn)可采用數(shù)組方式進(jìn)行。

 

原文地址:http://blog.csdn.net/zhaqiwen/article/details/7904515

 


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉