C语言技巧:把单一元素的数组放在末尾,struct可以拥有可变大小的数组
《C++ 對(duì)象模型》第19頁有這樣一句話
C程序員的巧計(jì)有時(shí)候卻成為c++程序員的陷阱。例如把單一元素的數(shù)組放在一個(gè)struct的末尾,于是每個(gè)struct objects可以擁有可變數(shù)組的數(shù)組:
正好之前看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)證:
打印結(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汽车电瓶换多少钱啊?
- 下一篇: 复印纸多少钱一箱啊?