簡體   English   中英

C-檢查是否分配了整數

[英]C - Check if Integer is assigned

如何確定是否未分配整數?

int i; /* no assignment */

if (/* conditional statement here to check if int i is unassigned or not */) {
   printf("Integer is unassigned!\n");
} else {
   printf("Integer is assigned!\n");
}

你不能 它將具有“未定義”的內容,這意味着它將包含當時該內存位置中的所有內容。

除非在全局范圍內聲明了i,否則它將被初始化為零。

C本質上不支持此功能-就像它本質上不支持對數組進行邊界檢查一樣。 在速度/效率和安全性之間進行權衡。

通常...初始化變量。

非常簡單 您知道它尚未分配,因為您沒有初始化它。

如果i是全局或靜態的,則其值將為0 ,否則它的值可以為任何值,並且無法找出是否為垃圾。

如果使用未初始化的值,您也許可以要求編譯器警告。 但是,它們並不是完全可靠的-在DFA不如您希望的那樣聰明的情況下,您偶爾會收到誤報,並且可能會偶爾出現誤報(我希望不會,但我不承擔任何責任)。

對於GCC:

-Wuninitialized -O1

如果要編寫條件代碼:

int a = 3;
int b;
int *p = (rand() > RAND_MAX/2) ? &a : &b;
if (is_uninitialized(*p)) // blah

那你就不走運了 與某些動態語言不同,C沒有“未定義的值”的概念。 如果未初始化變量,則不會為它提供一些特殊的值,以便以后進行測試。 它根本沒有賦值,因此使用該變量時會發生什么是不確定的。

正如其他人指出的那樣,您不能編寫一個C程序來檢測其自己的變量之一是否未初始化,而應努力確保始終對變量進行初始化。

  • 如果您的目標是確保所有變量都已初始化,則類似valgrind的工具可以通過昂貴的運行時分析來動態檢測未初始化變量的使用。

  • 如果您的目標是確保私有數據僅被初始化一次,通常的方法是使用

     int i; static bool initialized = 0; ... if (!initialized) { initialized = 1; i = ... i's initial value ...; } 

通常,C庫會將變量設置為0,但這不是必須的。

但基本上,您不能。 在定義中為其分配一個默認值,例如:

int i = 0; /* Or what ever value you know won't be used elsewhere */

然后,如果您運行一些代碼並想要檢查該值是否在此處設置,則可以與您的初始值進行比較。

正如所有先前的答案一樣,沒有辦法在運行時檢測到它。 但是,幾乎所有帶有靜態代碼分析工具的工具都會警告您未分配的變量。

在初始化(或分配)之前使用變量是導致錯誤的嚴重原因。 您無法在運行時可靠地對其進行檢查,但是可以在編譯期間或編譯之前對其進行檢測。

我建議不要在代碼中檢查它。 因為這可能會引起編譯器警告(在給變量賦值之前使用變量“ i”),所以會引入新的錯誤,並且在大中型程序中成功的可能性很小。

最好的方法是使用靜態代碼分析工具(例如QA / C或PCLint)。 在高警告敏感度級別使用編譯器是一個免費選項,與專用工具相比,其覆蓋范圍要小得多。

如果執行代碼審查,則還可以在清單上包括對未初始化變量的檢查。 這不是保證,但會觸發審閱者的手動檢查。

如果要進行運行時檢查,則可以通過將變量初始化為超出范圍的值來開始。 例如-1,表示正值。 然后您可以檢查

#define UNASSIGNED_VALUE -1
    static int number_of_apples = UNASSIGNED_VALUE;
    if (UNASSIGNED_VALUE == number_of_apples)
    {
       // error handling
    }

這不是真正的“非初始化”變量,但是至少您可以檢測到是否在合法范圍內完成了運行時分配。

在C語言中,整數在創建時采用未定義的值。 這意味着,如果您第一次使用該整數來自其中具有5893872的寄存器/內存位置/設備,則該整數就是該整數的值。 (調試/發布編譯的里程會有所不同。)

解決此問題的常用方法是使用無意義的默認值:

int number_of_widgets = -1;

...或用於指示其狀態的標志:

int number_of_widgets;
int number_of_widgets_assigned = 0;

if (number_of_widgets_assigned)
  do something
else
  do something else
number_of_widgets_assigned = 1;

沒有其他方法可以檢測是否已分配了某些內容-除非您想了解硬件的調試功能,而且我懷疑這與本次對話無關。

對於C而言,檢查所使用的變量是否在運行時進行初始化(賦值)是非常困難的。對於C語言來說,它沒有語言支持,並且在運行時可用的信息不足以完美檢測未初始化的值。 動態分析工具(如Valgrind / Memcheck)經過很長的時間(例如跟蹤進程地址空間中的每個內存字節,然后檢查每個存儲以將字節標記為initiialized),以確定use的值是否已初始化和仍然容易出現誤報。

如果您只是想最大程度地減少程序中的此類錯誤,則諸如lint之類的靜態分析工具可以很好地通知您是否正在使用未初始化的變量。 實際上,我相信大多數編譯器會盡力告訴您何時進行此操作(盡管它們當然並不完美)。

在C#中,我將使用:

Nullable<int> i = null; /* null assignment */

if (i == null) {
   printf("Integer is unassigned!\n");
} else {
   printf("Integer is assigned!\n");
}

不過,不確定是否將其轉換為C。

暫無
暫無

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

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