日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。