什麼是需要使用空指針才能正確執行的應用程序示例?簡單地檢查空指針並進行測試不算。這個例子應該是C程序員「常用的」。有沒有一個空指針在C中正確執行程序執行所需的例子?
經過一些更多的想法,我有一個可能的例子,但我不想影響(尚)的迴應。
編輯:這個問題是一個編程工作的採訪,它需要知識而不是C中的神似的技能。答案不會是語言的一些深奧的方面。
什麼是需要使用空指針才能正確執行的應用程序示例?簡單地檢查空指針並進行測試不算。這個例子應該是C程序員「常用的」。有沒有一個空指針在C中正確執行程序執行所需的例子?
經過一些更多的想法,我有一個可能的例子,但我不想影響(尚)的迴應。
編輯:這個問題是一個編程工作的採訪,它需要知識而不是C中的神似的技能。答案不會是語言的一些深奧的方面。
函數strtok()
對於第二次和隨後的迭代依賴於NULL;所以更好的表現親屬strtok_r()
和strtok_s()
。
略有不同的是強調:
字符串搜索功能,例如strchr()
和strstr()
返回NULL指針時,他們無法找到你問他們去尋找。
內存分配函數在分配失敗時返回NULL指針。
fopen()
函數無法打開文件時返回NULL指針。
opendir()
函數無法打開目錄時返回NULL指針。
在此注意一個主題?空指針通常作爲錯誤指示返回。這是否僅僅被視爲「只是檢查」或許更值得商榷。
我還被問到是否需要在使用'malloc()'後檢查任何東西,所以這肯定會在正確的軌道上。 – Adam27X
execvp
家族函數期望參數列表以空指針終止。例如,
execvp("/bin/ls", arguments);
這裏arguments
應該以NULL結尾。
這不就是「檢查空指針並進行測試」嗎?我的意思是,這就是'execvp'內部發生的事 - 'NULL'只是一個哨兵。也許我誤解了這個問題。 –
@CarlNorum:這更像是使用空指針作爲可變長度數組的終結符。 –
儘管這並沒有錯,但這絕對不是面試官尋找的答案。看我的編輯。答案是一個通用的,衆所周知的NULL指針的用法。 – Adam27X
NULL值顯然非常有用於指示「結束」或「不存在」某個值。例如,函數中的可選參數用NULL表示。或者「還沒有分配......」。
但是,作爲一個引用NULL值是沒有用的,它不是正確的使用NULL值除比較之外的任何東西,或者當你的指針不需要的時候賦值[顯然,假設它已經被正確釋放]。
我正在研究在操作系統啓動早期運行的一段代碼 - 在稍後運行代碼時,它需要在某些地方執行當前任務。但在系統正常啓動之前,目前沒有任何任務。所以我需要指出「沒有當前的任務」。我使用了一個NULL指針的組合[然後在指針爲NULL的情況下訪問相關的'reserve'數據結構]以及一個用於檢查是否已創建任務的變量。 [這是非常簡單的,但這個概念適用]。
從技術上講,在MS-DOS(或其他實際模式下的8086)中,一個NULL指針也可以用來設置除零的矢量[這是「矢量零」,矢量表是地址零 - 如此NULL]。但是由於現代操作系統的中斷向量表[通常]在其他地方,並且零地址通常不受讀/寫操作的保護,這不再是指針的「有效使用」。當然,其他一些嵌入式系統仍然可以使用地址零來表示「有意義」的東西。
鏈接列表。
struct node
{
int data;
node* next;
}
最後一個指針必須是NULL
,對吧?如果不是,程序將無法正確執行。這仍然可以算作測試,但它是正確執行程序所必需的。思考?
關閉我的頭頂:
strtok
使用獲得的第一個標記後連續令牌;exec*
功能的參數列表realloc
NULL
可以安全地傳遞到free()
,所以在案件初始化指針NULL
,他們往往可能有用或可在下面的代碼中沒有得到malloc()
-ed。然後您可以安全地撥打free()
,例如在函數結束時,不管指針是否被實際使用,例如
int * p = NULL; // NB: without this initialisation we would need additional logic
// to know whether to call free(p) or not later...
...
if (...)
{
...
if (...)
{
...
p = malloc(42);
...
}
...
}
...
free(p); // free allocated memory, or no-op if p == NULL
這是免費的行爲嗎?我確定過去使用過的C的一些實現有非常奇怪的效果,如果你釋放了空指針。 ThinkC for MacOS Classic是一個... –
@KenKeenan - 請參見[免費(ptr)其中ptr是NULL損壞的內存?](http://stackoverflow.com/a/1938758/188535)。答案是:是的,這是安全的。 – detly
是的,它是C89和C99中的標準,我相信,但早期實現(C89之前)可能沒有兌現這一點。順便說一句,同樣的約定適用於C++中的'delete'和'delete []'。 –
你是什麼意思?像取消引用'NULL'應該做些什麼? –
程序中的應用程序?或者一個(NULL)作爲有效參數的函數庫(庫)? –
@CarlNorum不一定是解除引用'NULL',而是以某種方式使用'NULL'指針。 @TheodorosChatzigiannakis一個程序。 – Adam27X