簡體   English   中英

未初始化的指針變量有什么用?

[英]What is an un-initialized pointer variable good for?

采訪中有人問我這個問題。

如果存在這樣聲明但未初始化的指針: int *ptr;

是否分配了默認值? 還是將它為空指針? 另外,如果我們嘗試使用以下指針,會發生什么情況:

if(ptr) { //block of code }

if條件會通過嗎? 另外,是否可以在調試/發布版本上使用?

我試圖在家中運行該程序,發現if條件通過,並且如果我嘗試打印ptr的值,如下所示:

printf("%x %d", ptr, *ptr);

它會打印一些隨機值,但不會使程序崩潰。 這背后的解釋是什么?

如果它是全局變量(或static ),則將其隱式初始化為NULL 否則,其值是不確定的。 因此,該if語句的行為是未定義的(即,您無法假設其可能會做什么)。 您的第二個示例的行為也是未定義的(可能會導致分段錯誤)。

未初始化的指針被認為是危險的。 想象一下這段代碼的后果:

int *ptr;

...

*ptr = 42;  // Dereference pointer and trash somewhere random in memory

但是請注意,這可能不會崩潰; 它可能會默默地破壞事物。

因此,慣例是始終顯式初始化它以指向有用的東西。 如果那是不可能的(例如,您還沒有要指向的東西),那么您可以做的下一個最佳選擇就是將其初始化為NULL 取消引用NULL指針將在大多數平台上引發分段錯誤,這至少將幫助您查找錯誤。

未初始化的指針有益於安全漏洞,並可能有助於播種隨機數生成器。

if指針已初始化為NULL (0), if條件只會跳過代碼塊。

由於默認情況下未定義初始化值,因此始終將其初始化為NULL被認為是一種好習慣。

您的printf語句僅說明了它默認為NULL以外的值的事實,在這種情況下,它是可以取消引用的有效內存區域。

未初始化的指針變量有什么用?

效率。 如果C自動將指向NULL指針初始化,則會浪費整個CPU指令(如果變量必須存儲在主存儲器中而不是寄存器中,則可能會浪費更多的CPU指令),這對於C的設計人員是不可接受的。您是否相信程序員幾天想犧牲寶貴的納秒級運行時間,以節省幾個小時的調試時間?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM