https://blog.csdn.net/zllbuaa/article/details/32335277
1.結(jié)構(gòu)體定義問題
typedef struct{
int a;
char b;
int b;
}test;
然后再程序中定義一個(gè)結(jié)構(gòu)體變量:struct test iseq;
引用成員變量:iseq.a=1;
編譯程序時(shí)候會(huì)出現(xiàn):dereferencing pointer to incomplete type錯(cuò)誤
解決方法:在結(jié)構(gòu)體定義的時(shí)候struct 后面一定要先有一個(gè)名字(不知道是否正確,但是實(shí)驗(yàn)結(jié)果是對的),改為如下:
typedef struct _test{
int a;
char b;
int b;
}test;
或者直接這樣定義:
struct test{
int a;
char b;
int b;
};
2.關(guān)于結(jié)構(gòu)體指針的使用
結(jié)構(gòu)體指針的使用一定要先用一個(gè)已知結(jié)構(gòu)體賦值或者先非配內(nèi)存。
例如定義1中的結(jié)構(gòu)體,程序中定義一下
struct test iseq;
struct test *tmp;
iseq.a=1;
tmp->a=1;
編譯程序時(shí)通過,但是運(yùn)行程序時(shí)會(huì)出現(xiàn)段錯(cuò)誤:segmentation fault;
解決方法:
(1)在使用tmp之前先賦值。
例如:tmp=&iseq;
(2)在使用前先分配內(nèi)存;
tmp=(struct test *)malloc(sizeof(struct test));
原因:結(jié)構(gòu)體指針在使用之前沒有分配內(nèi)存。
3.關(guān)于指針長度問題
以下例子:
char proname[100];
char *prefix="host";
struct test iseq;
struct test *tmp;
tmp=(struct test *)malloc(sizeof(struct test));
試想一下式子的值:
sizeof(proname);
sizeof(prefix)
sizeof (struct test);
sizeof(iseq);
sizeof(tmp);
sizeof(*tmp);
sizeof(*proname);
sizeof(*prefix);
strlen (prefix);
以上各式子的值分別為(64為機(jī)子,gcc編譯器)
100,8,12,12,8,12,1,1,4
通過以上實(shí)驗(yàn)可以知道:
指針的長度代表指針自己,例如64機(jī)子所有指針都是8bytes,sizeof(iseq)長度為12是因?yàn)橛袃?nèi)存對齊的原因,將char 對齊成四個(gè)字節(jié)。
想得到指針指向的內(nèi)存大小使用strlen函數(shù)。
sizeof(proname)為100,這也是指針和數(shù)組的區(qū)別之一。簡單來說就是數(shù)組對應(yīng)一塊內(nèi)存,地址和容量確定,而指針指向一塊內(nèi)存,大小可以變。
4.指針和數(shù)組的詳細(xì)區(qū)別
(1) 兩者在含義上的區(qū)別。
數(shù)組對應(yīng)著一塊內(nèi)存區(qū)域,而指針是指向一塊內(nèi)存區(qū)域。其地址和容量在生命期里不會(huì)改變,只有數(shù)組的內(nèi)容可以改變;而指針卻不同,它指向的內(nèi)存區(qū)域的大小可以隨時(shí)改變,而且當(dāng)指針指向常量字符串時(shí),它的內(nèi)容是不可以被修改的,否則在運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。
(2)計(jì)算內(nèi)存容量的區(qū)別
用運(yùn)算符sizeof可以計(jì)算出數(shù)組的容量(字節(jié)數(shù)),而用sizeof卻無法計(jì)算指針?biāo)竷?nèi)存的容量,用sizeof(p)得到的結(jié)果永遠(yuǎn)是 4或者8(具體根據(jù)機(jī)器有關(guān))。在進(jìn)行參數(shù)傳遞時(shí),數(shù)組會(huì) 自動(dòng) 退化為同類型的指針。