關於定義一個指針與指針變量
struct stat st;
struct stat *st;
【就事論事的解釋】
struct stat *st;
是定義了一個stat結構體的指針,
這句話的重點在於是“指針”,其本質上,(在32位的體係結構中)也就是一個32位的數而已。
對於名稱和實體來說:
名稱:
一個名字叫做st指針
實體:
內存裏麵,也隻有一個32位的空間,來存放這個指針。
struct stat st;
定義餓了一個stat類型的結構體,名字叫做st。
這裏的重點是“結構體”,其根據結構體具體定義的不同,占用不同的物理空間大小。
這裏的名稱和實體:
名稱,是一個叫做st的結構體。
實體:
就是一個結構體,結構體有多大,st就占用了多大的物理空間。
也就是說,比如你的結構體很複雜,比如所有成員空間加起來,有80字節,那麼,這個st實際就占用了80個字節的大小。
【為何容易犯錯】
意思解釋完了,說一下為何會犯這樣的錯誤,
我們是定義了這個:
struct stat *st;
但是,實際隻是定義所需要的結構體的指針,而不是實際結構體本身。
舉個例子,結構體好比是一個房間。
不同類型的房間大小不同,占用的物理空間也不一樣。
結構體的指針,好比一個房間的一把鑰匙。
不論其所相關的房間的大小,鑰匙,始終隻占鑰匙這麼大一點的空間(默認,可以理解為4個字節,32位)。
我們之所以犯這樣的錯,歸根結底,都是太“貪”了,以後弄了個指針(鑰匙),係統就會自動給你分配好了,
指針所指向的東西(別人就會給你個房子。。。)。
【引申】
以後不論你在別處再看見類似的指針,
不管這把鑰匙可以開的是,一個小房間,還是一棟別墅,還是一個汽車,還是一個玩具車,
它都隻是一把鑰匙而已,隻是這麼大而已。物理上分配的空間也都是32位而已。
記住,如果你沒有得到其他的房子或汽車,而隻是弄了把鑰匙。除非你買了房子(自己申請一個結構體),否則,沒人會白白送你房
子的(係統不會理會你這個指針指向哪裏,更不會自己另外給你分配一個結構體)。
如果還沒完全理解,那麼教個最簡單的方法,隻要記住這個就好了:
鑰匙 = 32位 = 4字節
這樣,你就不會搞混淆了。
【後記】
如果都隻是弄把鑰匙,就都有了房子車子,那麼現在就不會有這麼多為買房買車而鬱悶的了,
直接去幾元錢複製一把就好了。。。
個人理解:
同樣,結構體是如此,在定義其他類型也是一樣
char *str1;
char str2[20];
這麼定義之後,我們隻傳給str1一直指針,而不能給str1傳一個字符串。
在定義之後這樣使用:
sprintf(str1,"....",..);
那麼,這樣相當於往str1裏麵裝東西,但是str1在內存中是一個地址(可以看做一個數),那麼str1在內存中隻占1個或2個字節(實際根據OS來定)。把一個字符串往str1裏麵裝,就會出現Segment fault段錯誤。
非要這樣做,那就需要用malloc給sr1申請空間。
但是這樣是合法的:
char *str1="asdfg";定義並初始化,係統會給str1分配一個連續的空間放這個字符串,字符串的首地址放在str1中。
str1[20]在內存中那個,不管你是不是用,它都會有20個字節。
最後更新:2017-04-02 04:01:46
上一篇:
使用Qt做一個簡易音樂播放器[Phonon淺談--續]
下一篇:
《LINUX設備驅動程序》學習劄記(二)
【方法3:Perl版本】刪除Map中Value重複的記錄,並且隻保留Key最小的那條記錄
配置 mysql/mariadb sphinxSE 錯誤解決 1st column must be bigint to accept 64-bit DOCID
Android:Debug certificate expired on DATE 解決方法
簡單自學機器學習理論——引言 (Part I )
10分鍾自動部署Kubernetes測試開發集群
網絡釣魚大講堂 Part3 | 網絡釣魚攻擊向量介紹
企業最需職業排行榜第一位——數據分析師
關於hbase 在mr中出現的問題
JXCELL實例學習與研究(三) 之 EXCEL實現複選框 與 選擇區域填充顏色
穀歌大牛Jeff Dean是如何成為互聯網戰神的