2014-07-12 17 views
0

如果我用NULL初始化指針,那是錯的嗎?我面臨什麼問題?或者這只是糟糕的編程?正在向指針編程不良的NULL賦值?

int a,b,*ptr; 
ptr = NULL; 
ptr=&a; 

上述行有問題嗎?

+2

在上面的代碼中,它沒有實現任何功能。 –

+1

上面可能會/應該/可以寫成:int a = 0,b = 0,* ptr =&a;'。不確定*任何事物*往往會在未來出現未定義的行爲。它不是一些神聖的規則,而是一種遵循的良好慣例。在你的代碼中,將NULL(或任何其他)賦值給'ptr'意味着什麼,因爲在再次分配('a'的地址)之前,你永遠不會評估'ptr'。 – WhozCraig

+2

@MGaz如果你指的是我在我之前的評論中發佈的代碼,那麼說實話,我不能提出任何比你說的更恰當的話,而你是完全錯誤的。整行是decl +初始化。 – WhozCraig

回答

3

在您提供的代碼NULL是無用的,因爲指針永遠不會在兩個賦值(即分配NULL和指定和指定&a)之間進行訪問。不過,也有其他的情況下,當分配NULL的指針是非常可取的:

  • 如果一個內存位置的指針賦值發生條件,然後將指針傳遞給free在最後,你需要在初始化
  • 分配NULL指針當指針與free釋放,但仍然是一些額外的時間可見,你應該釋放它,避免懸空引用
  • 當情況可能會出現,當一個後置指針NULL指針在無效後被訪問,您需要指定NULL指針,以便儘可能快地失敗。
+1

第二點:只有在讀取和複製時才適用。到第三:應該追捕和消滅蟲蟲。 – Deduplicator

+1

@Deduplicator「應該追捕和消滅蟲子。」在我的回答中,我有沒有說出相反的結果?你不能追捕你看不到的錯誤。取消引用「NULL」實際上是確保崩潰的一種保證,而取消引用懸掛指針可能會造成對正在運行的程序的錯誤印象。 – dasblinkenlight

+0

@dasblinkenlight:實際上,據我可以告訴讀取未初始化變量的值 - 包括指針是UB,所以有人可能想提及它? –