昨天,剛剛請(qǐng)教了劉老師,對(duì)C語(yǔ)言指針的不安全操作有了一個(gè)更深刻的認(rèn)識(shí)。
初學(xué)指針的人,往往對(duì)char *p="Hello World"式的賦值認(rèn)為理所當(dāng)然,最造成的“該內(nèi)存不能written”式的錯(cuò)誤不知所措。
首先,我們要知道,char *p是聲明了一個(gè)指針,但我們并沒(méi)有要求它指向哪片內(nèi)存區(qū)域,因此它是隨機(jī)指向了某個(gè)地方。至于這個(gè)地方,既可能是空白內(nèi)存區(qū)域,也可能是我們已經(jīng)存放了數(shù)據(jù)的區(qū)域。若是前者,則無(wú)關(guān)緊要。若是后者,則會(huì)造成數(shù)據(jù)的覆蓋,使得程序受損,從而崩潰。這就是所謂的不安全指針運(yùn)用。
那么,如何做到安全的使用指針呢?
其實(shí)很簡(jiǎn)單,牢記“永遠(yuǎn)讓指針指向你所要的地方”,而不要讓它隨機(jī)指向某個(gè)地方。這樣,就防止了對(duì)有用數(shù)據(jù)的破壞,消除了不安全因素。例如:
char string[]="Hello World";
char *p;
p=string;
好了,這就使得*p指向了我們開(kāi)辟的字符串string[]的頭部,一切都是安全的(除非你讓指針地址增加時(shí)的增量增加到了字符串所占內(nèi)存區(qū)域結(jié)束之后的地方,或減少到了這片內(nèi)存的前方)。
不學(xué)好指針,就不算學(xué)好了C語(yǔ)言。因?yàn)楦呒?jí)語(yǔ)言里只有C語(yǔ)言能如此靈活強(qiáng)大的直接控制硬件,是對(duì)MCU控制的首先語(yǔ)言。這就是我們學(xué)C的前途所在。
好好學(xué)C,做驅(qū)動(dòng),做OS