C語言中長度為0的數(shù)組詳解
概述
長度為0的數(shù)組在標準c和c++中是不合法的,但是在gcc中是可行的。
長度為0數(shù)組它的最典型的用法就是位于結(jié)構(gòu)體中的最后一項。
使用方式
如下面的例子,分別使用長度為0的數(shù)組和指針聲明結(jié)構(gòu)體,實現(xiàn)可變長度的數(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é)對齊,test2中是由編譯器對齊的,所以兩個結(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)中運行結(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
使用長度為0的數(shù)組可以比指針更方便地進行內(nèi)存的管理。
結(jié)構(gòu)體test1在分配內(nèi)存時,則是采用一次分配的原則,一次性將所需的內(nèi)存全部分配給它,釋放也是一次釋放。數(shù)組和結(jié)構(gòu)體的內(nèi)存是連續(xù)的。
結(jié)構(gòu)體test2在分配內(nèi)存時,需采用兩步:首先,需為結(jié)構(gòu)體分配一塊內(nèi)存空間;其次再為結(jié)構(gòu)體中的成員變量分配內(nèi)存空間。這樣兩次分配的內(nèi)存是不連續(xù)的,需要分別對其進行管理。當使用長度為0的數(shù)組時,則是采用一次分配的原則,一次性將所需的內(nèi)存全部分配給它。相反,釋放時也是一樣的。
總結(jié)
長度為0的數(shù)組并不占有內(nèi)存空間,而指針方式需要占用內(nèi)存空間。
對于長度為0的數(shù)組,在申請內(nèi)存空間時,采用一次性分配的原則進行;對于包含指針的結(jié)構(gòu)體,才申請空間時需分別進行,釋放時也需分別釋放。
對于長度為0的數(shù)組元素的訪問可正常采用數(shù)組方式進行。
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Sublime Text 3 實現(xiàn)C++代碼的編譯和運行示例
下面小編就為大家?guī)硪黄猄ublime Text 3 實現(xiàn)C++代碼的編譯和運行示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
C++中拷貝構(gòu)造函數(shù)的總結(jié)詳解
深拷貝和淺拷貝可以簡單理解為:如果一個類擁有資源,當這個類的對象發(fā)生復(fù)制過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝2013-09-09
c語言字符串函數(shù)strstr,strtok,strerror的使用和實現(xiàn)
C語言中的字符串處理函數(shù)如strtok、strstr和strerror對于字符串的處理有著重要的作用,strtok函數(shù)用于分割字符串,它通過sep參數(shù)指定的分隔符來分割str參數(shù)指定的字符串,并返回分割后的每個子字符串2024-10-10
boost.asio框架系列之調(diào)度器io_service
這篇文章介紹了boost.asio框架系列之調(diào)度器io_service,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06
C/C++?Qt?數(shù)據(jù)庫與ComBox實現(xiàn)多級聯(lián)動示例代碼
Qt中的SQL數(shù)據(jù)庫組件可以與ComBox組件形成多級聯(lián)動效果,在日常開發(fā)中多級聯(lián)動效果應(yīng)用非常廣泛,今天給大家分享二級ComBox菜單如何與數(shù)據(jù)庫形成聯(lián)動,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2021-12-12

