2013-01-17 26 views
-4

什麼是需要使用空指針才能正確執行的應用程序示例?簡單地檢查空指針並進行測試不算。這個例子應該是C程序員「常用的」。有沒有一個空指針在C中正確執行程序執行所需的例子?

經過一些更多的想法,我有一個可能的例子,但我不想影響(尚)的迴應。

編輯:這個問題是一個編程工作的採訪,它需要知識而不是C中的神似的技能。答案不會是語言的一些深奧的方面。

+0

你是什麼意思?像取消引用'NULL'應該做些什麼? –

+0

程序中的應用程序?或者一個(NULL)作爲有效參數的函數庫(庫)? –

+0

@CarlNorum不一定是解除引用'NULL',而是以某種方式使用'NULL'指針。 @TheodorosChatzigiannakis一個程序。 – Adam27X

回答

6

函數strtok()對於第二次和隨後的迭代依賴於NULL;所以更好的表現親屬strtok_r()strtok_s()


略有不同的是強調:

  • 字符串搜索功能,例如strchr()strstr()返回NULL指針時,他們無法找到你問他們去尋找。

  • 內存分配函數在分配失敗時返回NULL指針。

  • fopen()函數無法打開文件時返回NULL指針。

  • opendir()函數無法打開目錄時返回NULL指針。

在此注意一個主題?空指針通常作爲錯誤指示返回。這是否僅僅被視爲「只是檢查」或許更值得商榷。

+0

我還被問到是否需要在使用'malloc()'後檢查任何東西,所以這肯定會在正確的軌道上。 – Adam27X

6

execvp家族函數期望參數列表以空指針終止。例如,

execvp("/bin/ls", arguments); 

這裏arguments應該以NULL結尾。

+1

這不就是「檢查空指針並進行測試」嗎?我的意思是,這就是'execvp'內部發生的事 - 'NULL'只是一個哨兵。也許我誤解了這個問題。 –

+3

@CarlNorum:這更像是使用空指針作爲可變長度數組的終結符。 –

+0

儘管這並沒有錯,但這絕對不是面試官尋找的答案。看我的編輯。答案是一個通用的,衆所周知的NULL指針的用法。 – Adam27X

0

NULL值顯然非常有用於指示「結束」或「不存在」某個值。例如,函數中的可選參數用NULL表示。或者「還沒有分配......」。

但是,作爲一個引用NULL值是沒有用的,它不是正確的使用NULL值除比較之外的任何東西,或者當你的指針不需要的時候賦值[顯然,假設它已經被正確釋放]。

我正在研究在操作系統啓動早期運行的一段代碼 - 在稍後運行代碼時,它需要在某些地方執行當前任務。但在系統正常啓動之前,目前沒有任何任務。所以我需要指出「沒有當前的任務」。我使用了一個NULL指針的組合[然後在指針爲NULL的情況下訪問相關的'reserve'數據結構]以及一個用於檢查是否已創建任務的變量。 [這是非常簡單的,但這個概念適用]。

從技術上講,在MS-DOS(或其他實際模式下的8086)中,一個NULL指針也可以用來設置除零的矢量[這是「矢量零」,矢量表是地址零 - 如此NULL]。但是由於現代操作系統的中斷向量表[通常]在其他地方,並且零地址通常不受讀/寫操作的保護,這不再是指針的「有效使用」。當然,其他一些嵌入式系統仍然可以使用地址零來表示「有意義」的東西。

2

鏈接列表。

struct node 
{ 
    int data; 
    node* next; 
} 

最後一個指針必須是NULL,對吧?如果不是,程序將無法正確執行。這仍然可以算作測試,但它是正確執行程序所必需的。思考?

+3

這不完全*必要*。雖然這是常見的用法,但任何其他類型的標誌都可以工作。 – netcoder

+1

這個答案與@ KingsIndian的答案基本相同。他的例子使用NULL作爲可變長度數組終止。這個使用它作爲列表,但都不需要*。 –

+0

IIRC,[Sedgewick在C++中的鏈表實現](http://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882)(不是這個版本,而是第二版,我想。也許它仍然是一樣的。)爲列表的末尾分配了一個結束節點(指向「next」中的自身)。 – ldav1s

0

關閉我的頭頂:

  • strtok使用獲得的第一個標記後連續令牌;
  • 終止exec*功能的參數列表
  • realloc
  • 使用了初始分配
0

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 
+0

這是免費的行爲嗎?我確定過去使用過的C的一些實現有非常奇怪的效果,如果你釋放了空指針。 ThinkC for MacOS Classic是一個... –

+2

@KenKeenan - 請參見[免費(ptr)其中ptr是NULL損壞的內存?](http://stackoverflow.com/a/1938758/188535)。答案是:是的,這是安全的。 – detly

+1

是的,它是C89和C99中的標準,我相信,但早期實現(C89之前)可能沒有兌現這一點。順便說一句,同樣的約定適用於C++中的'delete'和'delete []'。 –