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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言技巧:把单一元素的数组放在末尾,struct可以拥有可变大小的数组

發(fā)布時(shí)間:2023/12/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言技巧:把单一元素的数组放在末尾,struct可以拥有可变大小的数组 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

《C++ 對(duì)象模型》第19頁有這樣一句話
C程序員的巧計(jì)有時(shí)候卻成為c++程序員的陷阱。例如把單一元素的數(shù)組放在一個(gè)struct的末尾,于是每個(gè)struct objects可以擁有可變數(shù)組的數(shù)組:

struct mumble {/* stuff */char pc[1]; };//從文件或標(biāo)準(zhǔn)輸入裝置中取得一個(gè)字符串 //然后為struct 本身和該字符配置足夠的內(nèi)存struct mumble * pmumbl = (struct mumble*)malloc(sizeof(struct mumble) + strlen(string) +1); strcpy(&mumble.pc,string);

正好之前看MCP++的cache acess組件的時(shí)候也發(fā)現(xiàn)THashMap等結(jié)構(gòu)體在結(jié)構(gòu)體末尾使用了單一元素的數(shù)組,說明這一技巧確實(shí)用的廣泛,現(xiàn)在看看其原理:
結(jié)構(gòu)體的末尾定義了一個(gè)char數(shù)組,只分配了1個(gè)字符。那怎么能說是可變大小數(shù)組。
malloc函數(shù)分配了一堆的內(nèi)存。大小為結(jié)構(gòu)體+字符串+1(字符串結(jié)束符)
指針pmumbl指向的是malloc所分配的整個(gè)內(nèi)存,而pmumbl->pc指向的是這塊內(nèi)存的第一個(gè)字節(jié),因?yàn)閙alloc操作為整個(gè)string分配了足夠的內(nèi)存,所以在strcpy的時(shí)候,雖然溢出了pc的內(nèi)存范圍,但沒有溢出struct的內(nèi)存范圍,使得strcpy的結(jié)果就是合理的且可控的。相當(dāng)于struct擁有了可變大小的數(shù)組

C++中 public、protected、private內(nèi)的聲明順序可以被保證,但是這三個(gè)關(guān)鍵字的布局是不同的。因此總的排列順序并不能被保證。因此,不一定能實(shí)現(xiàn)struct的可變大小的數(shù)組,建議是不要那么做。
下面看一下代碼驗(yàn)證:

#include <iostream> #include <string.h> using namespace std;typedef struct mumble {/* stuff */char pc[1]; } mumble; int main(int argc, char **argv){mumble raw;raw.pc[0] = 'a';cout << "raw " << sizeof(raw) << endl;char str[10] = "abcdefgxa";mumble* mumptr = (mumble*)malloc(sizeof(mumble) + strlen(str));strcpy_s(mumptr->pc,strlen(str) + 1, str);cout << "mumptr " << sizeof(*mumptr) << endl;cout << mumptr->pc << endl;free(mumptr); }

打印結(jié)果:sizeof并不能獲取mumptr的真實(shí)大小,但是通過下標(biāo)訪問確實(shí)能夠訪問到pc

raw 1 mumptr 1 abcdefgxa

內(nèi)存分布圖:

會(huì)發(fā)現(xiàn)內(nèi)存中確實(shí)有值:

所以以后定義可變包結(jié)構(gòu)時(shí)候,結(jié)構(gòu)中沒有可變包的大小,而是只要在結(jié)構(gòu)里最后加一個(gè)元素的字節(jié)數(shù)組就可以。

參考:
https://blog.csdn.net/qq_35749455/article/details/116356006

https://blog.csdn.net/weixin_30855761/article/details/99864866?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-3.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-3.pc_relevant_default&utm_relevant_index=5

總結(jié)

以上是生活随笔為你收集整理的C语言技巧:把单一元素的数组放在末尾,struct可以拥有可变大小的数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天舔天天舔 | 91亚洲高清 | 欧美精品做受xxx性少妇 | 影音先锋成人资源网站 | 91亚洲视频在线 | 在线看成人 | 林由奈在线观看 | 欧美综合专区 | 婷婷国产一区二区三区 | 成人性做爰片免费视频 | 鬼灭之刃柱训练篇在线观看 | 波多野结衣黄色网址 | zzji欧美大片| 国产 日韩 欧美 成人 | 国产在线aaa| 最新日韩在线视频 | 欧美一级黄色片视频 | 粉嫩av一区 | 在线岛国| 国产高清精品在线观看 | 婷婷六月综合 | 中文在线字幕免费观看 | 中文字幕超清在线观看 | 91中文字日产乱幕4区 | 日本三级视频在线 | 欧美啪啪一区 | 开心色婷婷 | 国内精品视频在线 | 玖玖精品在线视频 | 三级在线免费 | 欧美xxxxxhd | 精品无码黑人又粗又大又长 | 一区二区三区网站 | 国产无码精品在线观看 | 岛国一区| 日韩av无码一区二区三区 | 日本欧美久久久久免费播放网 | 亚洲欧美日韩系列 | 交做爰xxxⅹ性爽 | 人人妻人人澡人人爽精品日本 | 成人免费看片&#39; | 18禁裸乳无遮挡啪啪无码免费 | 黄色一级视频片 | 水蜜桃亚洲精品 | 亚洲国产精品免费在线观看 | 激情福利社| 中国女人内96xxxxx | 中国人妖和人妖做爰 | 黄色av片三级三级三级免费看 | 91视频免费 | 亚洲高清视频在线播放 | 看片网站在线观看 | 亚洲一区高清 | 久久三级精品 | 国产精品久久久精品三级 | 国产亚洲色婷婷久久99精品91 | 九色蝌蚪porny | 国产精品视频一二区 | 男人资源网站 | 99资源网| av在线不卡免费观看 | 97超碰中文字幕 | av黄色影院 | 亚洲av高清一区二区三区 | 宅男噜噜噜66一区二区 | av.www| 午夜激情免费视频 | 欧美a在线| 在线免费观看黄色片 | 成人网在线| 亚洲一区二区三区久久 | 日日色av | 巨大乳の揉んで乳榨り奶水 | 少妇无套内谢免费视频 | 风流少妇一区二区三区91 | 国产人成在线观看 | 嫩草影院污| 超碰97最新 | 日韩av麻豆| 国产swag在线观看 | 女人扒开屁股让男人捅 | 国产精品久久免费视频 | 奶妈的诱惑| 无码人中文字幕 | 欧美日韩国产二区 | 亚洲图片中文字幕 | 九九久久网 | 男人与雌性宠物交啪啪 | 精品国产va久久久久久久 | 亚洲日本色图 | 久热只有精品 | 国产男女无遮挡猛进猛出 | 国产福利免费视频 | china国模大尺度pics | 蜜臀99久久精品久久久久久软件 | 日韩久久不卡 | 女人高潮潮呻吟喷水 | аⅴ资源中文在线天堂 | 美女性高潮视频 |