1、const其實(shí)并不是真正的常量(P32)

2、早期的gets()中的Bug導(dǎo)致了Internet蠕蟲(P42)
gets()函數(shù)并不檢查緩沖區(qū)的空間,事實(shí)上它也無法檢查緩沖區(qū)的空間。如果函數(shù)的調(diào)用者提供了一個(gè)指向堆棧的指針,并且gets()函數(shù)讀入的字符數(shù)量超過緩沖區(qū)的空間,gets()函數(shù)將會(huì)愉快地將多出來的字符繼續(xù)寫入到堆棧中,這就覆蓋了堆棧原先的內(nèi)容。——這就是病毒利用它來寫入額外空間,并引發(fā)蠕蟲病毒的前提。
推薦的方式是將
gets(line)
替換為
if(fgets(line, sizeof(line), stdin) == NULL)
exit(1);
3、相鄰字符串常量自動(dòng)連接(P45)
這個(gè)其實(shí)已經(jīng)應(yīng)用很普遍了,但是我個(gè)人用的比較少,特此記錄一下。
4、返回一個(gè)指針?(P48)
這個(gè)話題圍繞一個(gè)程序的BUG來展開,這個(gè)程序返回了局部變量的值的指針,這么說當(dāng)然你一眼就能看得出來問題所在,但是在很多時(shí)候,這個(gè)錯(cuò)誤卻總是在你的眼皮子底下溜走。
作者提供了五種方式,只能說可以用,但唯一推薦的只有一個(gè),詳見作者的分析(P48)(不是什么高深的理論,你自己也能分析地出來)。
a.返回一個(gè)字符串常量的指針。因?yàn)槌A看嬖陟o態(tài)數(shù)據(jù)存儲(chǔ)區(qū),所以指針沒問題。
b.使用全局聲明的數(shù)組。提到全局兩個(gè)字,就知道這個(gè)方法有很大的局限性。
c.使用靜態(tài)數(shù)組。下一次調(diào)用將覆蓋這個(gè)數(shù)組內(nèi)容。
char * func() {
static char buffer[20];
…
return buffer;
}
d.顯式分配一些內(nèi)存,保存返回的值。
char * func() {
char * s = malloc(120);
…
return s;
}
既然用到了malloc,就必然伴隨著free,因此帶來了內(nèi)存管理的問題,增加了開發(fā)者負(fù)擔(dān)。
e.(推薦)在調(diào)用前后,由函數(shù)調(diào)用者分配內(nèi)存,并由其釋放,在同一地方釋放對(duì)于內(nèi)存管理來說代價(jià)相對(duì)最小。
void func( char * result, int size) {
…
strncpy(result, “That’d be in the data segment, Bob”, size);
}
buffer = malloc(size);
func(buffer, size);
…
free(buffer);