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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

C 语言中结构体强制转换--实验

發(fā)布時(shí)間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C 语言中结构体强制转换--实验 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

對于C語言中結(jié)構(gòu)體強(qiáng)制轉(zhuǎn)換做了如下實(shí)驗(yàn), 或許可以解惑一些問題

對于結(jié)構(gòu)體, 我理解的屬性有: 成員的順序,?成員的類型,成員的個(gè)數(shù),成員名稱,這些屬性在對結(jié)構(gòu)操作的時(shí)候會(huì)有一些影響, 比如結(jié)構(gòu)體的對齊, 結(jié)構(gòu)體的強(qiáng)制轉(zhuǎn)換.

處于對上述描述的理解,做出如下測試工作,

以結(jié)構(gòu)強(qiáng)制轉(zhuǎn)換實(shí)現(xiàn)為目的, 實(shí)現(xiàn)順序,類型,個(gè)數(shù)在不同的組合下,轉(zhuǎn)換的結(jié)果,

一 : ?成員順序&& 成員類型

#include <iostream> using namespace std;typedef struct _foo{short a;int b; }foo;typedef struct _bar {int a;short b; }bar;int main() {foo f={1,2};bar *pbar = (bar*)&f;printf("%d\r\n",pbar->a);printf("%d\r\n",pbar->b);return 0; }/* output: -859045887 2 */ #include <iostream> using namespace std;typedef struct _foo{char* a;int b; }foo;typedef struct _bar {short a;long long b; }bar;int main() {foo f={"zhang",2};bar* pbar = (bar*)&f;printf("%d\r\n",pbar->a);printf("%d\r\n",pbar->b);return 0; } /* output: -13200 -858993460 */

通過測試,在成員的順序不同的時(shí)候, 如果進(jìn)行強(qiáng)制的轉(zhuǎn)換,結(jié)果是不可預(yù)知的,危險(xiǎn).

在成員類型完全不一致的情況下, ?結(jié)果是不可以預(yù)計(jì)的.

// 成員名稱

#include <iostream> using namespace std;typedef struct _foo{short a;int b; }foo;typedef struct _bar {short b;int a; }bar;int main() {foo f={1,2};bar* pbar = (bar*)&f;printf("%d\r\n",pbar->b);printf("%d\r\n",pbar->a);return 0; } /* output: 1 2 */

測試結(jié)論: 結(jié)構(gòu)體強(qiáng)制轉(zhuǎn)換時(shí),與成員的名稱沒有關(guān)系,在順序保持一致的情況下.

// 成員長度

#include <iostream> using namespace std;typedef struct _foo {int a;char *s; }foo;typedef struct _bar {int a;char* s;int b; }bar;int main() {foo f={1,"zhangchao"};bar* pbar = (bar*)&f;printf("%d\r\n",pbar->a);while(*(pbar->s) != '\0'){printf("%c",*(pbar->s));(pbar->s)++;}printf("\r\n");printf("%d\r\n",pbar->b);return 0; }/* output: 1 zhangchao -858993460 */

在屬性保持一致的情況下, 多的成員類型的值不可預(yù)計(jì).

// 成員裁剪,

#include <iostream> using namespace std;typedef struct _foo {int a;char *s; }foo;typedef struct _bar {int a;char* s;int b; }bar;int main() {bar f={1,"zhangchao",2};foo* pbar = (foo*)&f;printf("%d\r\n",pbar->a);while(*(pbar->s) != '\0'){printf("%c",*(pbar->s));(pbar->s)++;}printf("\r\n");// 如下的訪問操作是錯(cuò)誤的, 該語句僅僅是為了測試.//printf("%d\r\n",pbar->b);return 0; }

在多成員結(jié)構(gòu)體轉(zhuǎn)換為少成員結(jié)構(gòu)體時(shí),注意不要訪問不存在的成員;

通過如上的測試, 如果要進(jìn)行結(jié)構(gòu)體的強(qiáng)制轉(zhuǎn)換, 需要考慮如上的因素.?

如果測試遺漏的,請指正,謝謝.

更新:

1? 上述的測試代碼只看到了表面 的現(xiàn)象, 結(jié)論是: 不同的的結(jié)構(gòu)體間互相的轉(zhuǎn)換, 最終的結(jié)果是截?cái)嗷蚴茄a(bǔ)充。

2? 轉(zhuǎn)換的實(shí)質(zhì)是 : 按照數(shù)據(jù)在內(nèi)存中的位置,逐個(gè)給左值中的成員賦值。 特別注意,結(jié)構(gòu)體的對齊問題。

所以會(huì)出現(xiàn)讀取到的數(shù)據(jù)是異常的

轉(zhuǎn)載于:https://my.oschina.net/u/1579560/blog/1555722

總結(jié)

以上是生活随笔為你收集整理的C 语言中结构体强制转换--实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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