笔试训练第二次知识点汇总
linux中 文件屬性以 l、b、c、d。開頭的都是什么文件?
l是鏈接,相當于windows的快捷方式
d是目錄,相當于windows的文件夾
c是字符設備文件,給你說你不懂,鼠標,鍵盤算是
b是塊設備,硬盤就是一個例子
?
/etc/services : 定義網絡服務的端口
?
linux中 UID PID PPID 分別是什么?
UID是用戶ID,
PID是進程ID,
PPID是父進程ID。
?
程序kill -9與kill -15的區別
?
在Linux/unix下,中止一個Java進程有兩種方式,一種是kill -9 pid,一種是kill -15 pill(默認)。
兩種方式的區別是:
SIGNKILL(9) 的效果是立即殺死進程. 該信號不能被阻塞, 處理和忽略。
SIGNTERM(15) 的效果是正常退出進程,退出前可以被阻塞或回調處理。并且它是Linux缺省的程序中斷信號。
?
內存分配方式有幾種?
靜態存儲區 棧 堆 的內存分配
1,從靜態存儲區域分配內存。(全局變量 static)程序編譯的時候內存已經分配好了,并且在程序的整個運行期間都存在,例如全局變量。
2,在棧上創建。在執行函數時,函數內局部變量的存儲單元可以在棧上創建,函數結束時這些存儲單元自動被釋放。
處理器的指定集中有關于棧內存的分配運算,因此效率比較高,但是分配的內存容量有限。
3,在堆上分配內存,亦稱動態內存分配,程序在運行的時候用malloc函數或new運算符申請任意大小的內存,程序員要用free函數或delete運算符釋放內存。動態內存使用非常靈活,但問題也很多。
?
常見的錯誤 ??? ?
類型 1:內存未分配成功,卻使用了它。
方 ? 法:在使用之前檢查指針是否為NULL。
? ? ? ? ? ? ?1)當指針p是函數的參數時,在函數入口處用語句assert(p!=NULL)進行斷言檢查。
? ? ? ? ? ? ?2)當使用malloc或new來申請內存時,應該用if(p != NULL)進行防錯檢查。
類型?2:引用了尚未初始化的指針
原 ? 因:內存的缺省初始值究竟是什么并沒有統一的標準,在使用之前都進行初始化。
? ? ? ? ? ? ? 1)沒有初始化的觀念。
? ? ? ? ? ? ? 2)內存的缺省值是未定義,即垃圾值。
類型?3:越界操作內存
原 ? 因:內存分配成功且初始了,但越界操作是不允許的。
例 ? 如:在使用數組時經常發生下標“多1”或“少1”,特別是在for循環語句時。
類型?4:忘記釋放內存,造成內存泄漏。
原 ? 因:含有這種類型錯誤的函數,每被調用一次,就丟失一塊內存。當內存充足時看不到這種錯誤帶來的影響,當內存耗盡時系統提示:“內存耗盡”。因此,動態內存的申請與釋放必須配對,程序中malloc與free的使用次數要相同。
類型?5:釋放了內存卻繼續使用它
原 ? 因:對應的情況有2種
? ? ? ? ? ? ? 1)返回了“棧內存的指針或引用”,因為堆棧中的變量在函數結束后自動銷毀。
? ? ? ? ? ? ? 2)某塊內存被free后,沒有將指向該內存的指針設置為NULL,導致產生“野指針”
?
野指針
? ? ? ?概念:“野指針”不是NULL指針,是指指向“垃圾”內存的指針。即指針指向的內容是不確定的。
指向不確定地址的指針變量
訪問了沒有權限的內存
訪問了已經釋放了的內存
? ? ? ?產生的原因:1)指針變量沒有初始化。因此,創建指針變量時,該變量要被置為NULL或者指向合法的內存單元。
? ? ? ? ? ? ? ? ? ? ??2)指針p被free之后,沒有置為NULL,讓人誤以為p是個合法的指針。
? ? ? ? ? ? ? ? ? ? ?3)指針跨越合法范圍操作。不要返回指向棧內存的指針或引用
例子1-1:引用尚未初始化的指針
[cpp]?view plain?copy
char?*p;??
*p?=?'A';//error,p指向未定義??
例子1-2:return語句返回指向“棧內存”的指針
[cpp]?view plain?copy
char?*GetString1(void)??
{??
????char?p[]?=?"hello?world!";??
????//p在棧區,常量字符串在常量字符區??
??
????return?p;//error,返回棧內存的地址??
}??
例子1-3:使用了被釋放的內存
[cpp]?view plain?copy
char?*pstr?=?(char?*)malloc(sizeof(char)*100);??
free(pstr);?//pstr所指的內存被釋放??
if?(NULL?!=pstr)//沒起到作用??
{??
????strcpy(pstr,"string!");//error,有時候程序不會提示有誤,但還是不允許??
}??
注意:free()釋放的是指針指向的內存!不是指針變量!這點非常非常重要!指針是一個變量,只有程序結束時才被銷毀。釋放了內存空間后,原來指向這塊空間的指針還是存在!只不過現在指針指向的內容的垃圾,是未定義的,所以說是垃圾。因此,前面我已經說過了,釋放內存后把指針指向NULL,防止指針在后面不小心又被解引用。
對比下面的例子,加深理解
例子1-4:函數返回值傳遞動態內存
[cpp]?view plain?copy
char*?GetMemory(int?num)??
{??
????char?*p?=?(char?*)malloc(sizeof(char)?*?num);??
????return?p?;//ok,返回堆區的地址值??
}??
例子1-5:
[cpp]?view plain?copy
char?*GetString(void)??
{??
????char?*p?=?"hello?world!";??
????//指針變量p在棧區,指向文字常量區的字符??
??
????return?p;//ok,返回字符串的地址??
}??
?
避免的方法:
1.使用前對其初始化(置為null;用malloc分配內存,訪問合法內存)
2.指針用完后記得釋放內存(置為null, 用malloc的用free , 用memset清零內存)
?
寫bool , float, ?指針變量 與“零值”比較的if語句。
布爾變量與零值比較?
l 【規則4-3-1】不可將布爾變量直接與TRUE、FALSE或者1、0進行比較。?
根據布爾類型的語義,零值為“假”(記為FALSE),任何非零值都是“真”(記為TRUE)。TRUE的值究竟是什么并沒有統一的標準。例如Visual?? C++?? 將TRUE定義為1,而Visual?? Basic則將TRUE定義為-1。?
假設布爾變量名字為flag,它與零值比較的標準if語句如下:?
if?? (flag) //?? 表示flag為真?
if?? (!flag) //?? 表示flag為假?
其它的用法都屬于不良風格,例如:?
if?? (flag?? ==?? TRUE)?
if?? (flag?? ==?? 1?? )?
if?? (flag?? ==?? FALSE)???????
if?? (flag?? ==?? 0)?
4.3.2?? 整型變量與零值比較?
l 【規則4-3-2】應當將整型變量用“==”或“!=”直接與0比較。?
假設整型變量的名字為value,它與零值比較的標準if語句如下:?
if?? (value?? ==?? 0)???????
if?? (value?? !=?? 0)?
不可模仿布爾變量的風格而寫成?
if?? (value) //?? 會讓人誤解?? value是布爾變量?
if?? (!value)????
4.3.3?? 浮點變量與零值比較?
l 【規則4-3-3】不可將浮點變量用“==”或“!=”與任何數字比較。?
千萬要留意,無論是float還是double類型的變量,都有精度限制。所以一定要避免將浮點變量用“==”或“!=”與數字比較,應該設法轉化成“> =”或“ <=”形式。?
假設浮點變量的名字為x,應當將?
if?? (x?? ==?? 0.0)?? //?? 隱含錯誤的比較?
轉化為????
if?? ((x> =-EPSINON)?? &&?? (x <=EPSINON))?
其中EPSINON是允許的誤差(即精度)。?
例如精度為:const float EPSINON = 0.00001;
4.3.4?? 指針變量與零值比較?
l 【規則4-3-4】應當將指針變量用“==”或“!=”與NULL比較。?
指針變量的零值是“空”(記為NULL)。盡管NULL的值與0相同,但是兩者意義不同。假設指針變量的名字為p,它與零值比較的標準if語句如下:?
if?? (p?? ==?? NULL) //?? p與NULL顯式比較,強調p是指針變量?
if?? (p?? !=?? NULL)?
不要寫成?
if?? (p?? ==?? 0)?? //?? 容易讓人誤解p是整型變量?
if?? (p?? !=?? 0)?????????????
或者?
if?? (p) //?? 容易讓人誤解p是布爾變量?
if?? (!p)?
?
滅絕人性的智力題
三人決斗問題:
三個小伙子同時愛上了一個姑娘,為了決定他們誰能娶這個姑娘,他們決定用手槍進行一次決斗。阿歷克斯的命中率是30%,克里斯比他好些,命中率是50%,最出色的槍手是鮑博,他從不失誤,命中率是100%。由于這個顯而易見的事實,為公平起見,他們決定按這樣的順序:阿歷克斯先開槍,克里斯第二,鮑博最后。然后這樣循環,直到他們只剩下一個人。那么這三個人中誰活下來的機會最大呢?他們都應該采取什么樣的策略?
三人相對
A活下來有三種情況
1.A殺了C,B殺不死A,A又殺了B,概率30%×50%×0.3/0.65
2.A殺不死C,B殺了C,A殺了B,概率70%×50%×0.3/0.65
3.A殺不死C,B殺不死C,C殺了B,A殺了C,概率70%×50%×30%
所以A活下來的可能性為0.105+3/13≈0.336大于三分之一,比較幸運了。
B活下來有三種情況
1.A殺了C,B殺了A,概率30%×50%
2.A殺不死C,B殺了C,AB相對的情況下B殺了A,概率70%×50%×0.35/0.65
3.A殺了C,B殺不了A,AB相對的情況下B殺了A,概率30%×50%×0.35/0.65
所以B活下來的可能性為0.15+3.5/13≈0.419大于三分之一,非常幸運了。
C活下來只有一種情況
A殺不死C,B殺不死C,C殺了B,A殺不死C,C殺了A,概率70%×50%×70%
所以C活下來的可能性為0.245小于三分之一,非常不幸。
ABC活下來可能性之和恰為1。
?
?
?
?
?
總結
以上是生活随笔為你收集整理的笔试训练第二次知识点汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异或方式找到一组数组中不重复的两个数(同
- 下一篇: 笔试训练第三次知识点汇总