(四)C语言柔性数组、指针赋值
一、柔性數(shù)組
今天看了公司的代碼,發(fā)現(xiàn)一個很奇怪的問題,后來自己寫了類似代碼,我先把代碼貼出來吧。
#include<stdio.h> #include<string.h> #include<stdlib.h>typedef struct {char ucDstMac[6];char ucSrcMac[6];int usType; int usLen; char ucCode; char ucSeq; char ucSlot; char ucInfo[]; }DEV_CARD_MSG_S;int main(void) {int i = 0;DEV_CARD_MSG_S* DS1;char data[64];DS1 = (DEV_CARD_MSG_S*)malloc(sizeof(DEV_CARD_MSG_S));memset(data,0,sizeof(data));DS1 = (DEV_CARD_MSG_S*)data;DS1-> ucCode = 'A';DS1-> ucInfo[6] = 'B';printf("DS1-> ucCode=%c\nDS1-> ucInfo[6]=%c\n",DS1-> ucCode,DS1-> ucInfo[6]);for(i=0;i<64;i++)printf("data[%d]=%c\n",i,data[i]);return 0; }好奇怪啊,有木有,結(jié)構(gòu)體中竟然定義了一個包含0個元素的數(shù)組,當時看到這里就暈暈的。后來查找了資料,才知道這就是傳說中柔性數(shù)組,柔性數(shù)組一般應(yīng)用在結(jié)構(gòu)體中,數(shù)組大小可變的場合中。
我們分析上述程序,data是一個占64字節(jié)的字符數(shù)組,DS1 = (DEV_CARD_MSG_S*)這行代碼相當于給DS1結(jié)構(gòu)體分配了64字節(jié)的地址,而這個結(jié)構(gòu)體中定義時只申請了23字節(jié)的地址,此時還省64-23=41字節(jié)的地址會全部分配給DEV_CARD_MSG_S結(jié)構(gòu)體中的ucInfo數(shù)組,因此此時即使我們寫出DS1->ucInfo[40]='D'也是合法的,因為我們?yōu)閿?shù)組ucInfo申請了41字節(jié)的地址空間。
上述程序打印如下,只貼出一部分:
(二)指針賦值
我們看上面代碼執(zhí)行的結(jié)果,發(fā)現(xiàn)我們代碼中只操作了DS1結(jié)構(gòu)體指針,結(jié)果data數(shù)組的值也跟著變化了,而且地址是對應(yīng)的。剛開始看到這種神奇的代碼我也好好奇。我們看到程序中有這么一行代碼:DS1 = (DEV_CARD_MSG_S*)data;這是指針之間的賦值,也就是說結(jié)構(gòu)體DS1和data數(shù)組在內(nèi)存中占用的地址是一樣的。其實這個代碼和下面這個是類似的,我們看下面的代碼就可以很好地理解了。
#include<stdio.h> int main() {int *P = NULL;int a = 10;P = &a;*P =20;printf(" a = %d\n*P = %d\n",a,*P);printf("&a = %p\n P = %p\n",&a,P);return 0; }程序執(zhí)行結(jié)果如下:
我們看到,我們操作P指針也就是操作a變量,同時他們兩個占用的內(nèi)存地址是一樣的。因此只要*P的值改變了,a的值也就跟著改變了。這個特點很重要,在工程中應(yīng)用的還是蠻多的。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhangshenghui/p/5368495.html
總結(jié)
以上是生活随笔為你收集整理的(四)C语言柔性数组、指针赋值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phpmyadmin #1045 -
- 下一篇: ACM学习历程—Hihocoder 12