日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(四)C语言柔性数组、指针赋值

發布時間:2024/6/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (四)C语言柔性数组、指针赋值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、柔性數組

今天看了公司的代碼,發現一個很奇怪的問題,后來自己寫了類似代碼,我先把代碼貼出來吧。

#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; }

好奇怪啊,有木有,結構體中竟然定義了一個包含0個元素的數組,當時看到這里就暈暈的。后來查找了資料,才知道這就是傳說中柔性數組,柔性數組一般應用在結構體中,數組大小可變的場合中。

我們分析上述程序,data是一個占64字節的字符數組,DS1 = (DEV_CARD_MSG_S*)這行代碼相當于給DS1結構體分配了64字節的地址,而這個結構體中定義時只申請了23字節的地址,此時還省64-23=41字節的地址會全部分配給DEV_CARD_MSG_S結構體中的ucInfo數組,因此此時即使我們寫出DS1->ucInfo[40]='D'也是合法的,因為我們為數組ucInfo申請了41字節的地址空間。

上述程序打印如下,只貼出一部分:

(二)指針賦值

我們看上面代碼執行的結果,發現我們代碼中只操作了DS1結構體指針,結果data數組的值也跟著變化了,而且地址是對應的。剛開始看到這種神奇的代碼我也好好奇。我們看到程序中有這么一行代碼:DS1 = (DEV_CARD_MSG_S*)data;這是指針之間的賦值,也就是說結構體DS1和data數組在內存中占用的地址是一樣的。其實這個代碼和下面這個是類似的,我們看下面的代碼就可以很好地理解了。

#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; }

程序執行結果如下:

我們看到,我們操作P指針也就是操作a變量,同時他們兩個占用的內存地址是一樣的。因此只要*P的值改變了,a的值也就跟著改變了。這個特點很重要,在工程中應用的還是蠻多的。

?

轉載于:https://www.cnblogs.com/zhangshenghui/p/5368495.html

總結

以上是生活随笔為你收集整理的(四)C语言柔性数组、指针赋值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。