C 语言中结构体强制转换--实验
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java在线问题诊断工具Greys
- 下一篇: 直接管理内存——new和delete