我知道有類似的帖子,并且指標被初始化為 NULL 以避免延遲隨機地址,但是如果程式員宣告指標是因為他稍后將使用它并為其分配一個有效地址。所以想象一下這段代碼:
int main() {
int *p;
p = (int *)malloc(sizeof(int));
}
NULL那么,如果我稍后要為指標分配一個有效地址,為什么還要初始化一個指標呢?
uj5u.com熱心網友回復:
根據您的編譯器標志,您可能會在沒有初始化值的情況下宣告變數時收到警告。始終初始化變數被認為是一種很好的做法,因為它可以防止使用未初始化的記憶體。在最好的情況下,它只是隨機資料,但在最壞的情況下,它可能包含記憶體中可能被利用的剩余資料。
在這種情況下,您可以簡單地初始化指向 malloc 結果的指標。但是,如果您想保留未分配的記憶體,最佳做法是將其分配給 NULL(即 0)。這也允許您測驗該值是否已在某個時間點被初始化。
您可以檢查初始化如下:
if (p) {
printf("The value of p is %d", *p);
}
else {
printf("p is null");
}
uj5u.com熱心網友回復:
為什么確實如此。答案是:你不應該。
您甚至不應該在沒有為其賦值的情況下宣告該變數。所以你的代碼應該是:
int main() {
int *p = (int *)malloc(sizeof(int));
... // check return value, jada jada jada
}
如果賦值位于不同的范圍內,則可能有理由先宣告變數,然后再賦值。
在這種情況下,有兩種情況下分配nullptr是有意義的:
分配是有條件的,您稍后必須檢查是否分配了某些東西。
編譯器無法確定變數確實被分配了一些東西,然后警告
p可能未初始化使用。在仔細檢查編譯器實際上并不正確之后,可能會初始化p為nullptr洗掉警告。
uj5u.com熱心網友回復:
如果要在宣告后立即為其賦值,則無需在其宣告中初始化指向 NULL 的指標。
就是這樣的代碼
int main( void )
{
int *p = NULL;
p = (int*)malloc(sizeof(int));
//...
}
沒有多大意義。
只需在使用它們的最小范圍內宣告指標。例如
int main( void )
{
int *p = malloc(sizeof(int));
//...
}
考慮另一個例子
void f( void )
{
unsigned int x;
printf( "Enter a positive value: " );
if ( scanf( "%u", &x ) == 1 && x > 0 )
{
// do something
}
else
{
// issue an error
}
}
x用某個值初始化變數是沒有意義的。它立即被宣告和使用。
當然可以寫
unsigned int x = 0;
但這不會使您的代碼更清晰和容易出錯,而且只會使讀者感到困惑,因為要想象初始化的含義,他無論如何都需要進一步閱讀以查看 if 陳述句。
如果按照以下方式重寫函式,初始化將有意義
void f( void )
{
unsigned int x = 0;
printf( "Enter a positive value: " );
scanf( "%u", &x );
if ( x == 0 )
{
// issue an error
}
else
{
// do something
}
}
有時您甚至無法在其宣告中初始化一個物件。
假設您有一個包含許多資料成員的結構,并且它們的初始化取決于許多條件。所以你必須寫
struct S s;
if ( /* some condition */ )
{
// initialize data members according to the condition
}
else if ( /* another condition */ )
{
// initialize data members according to this condition
}
else
{
// initialize data members some other way
}
主要原則是在使用它們的最小范圍內宣告變數并立即使用它們。冗余初始化只會使代碼的讀者感到困惑,因為他們需要考慮為什么您以這種方式而不是另一種方式初始化變數。
當指標的宣告和它的使用之間有很多行代碼時,就會出現問題。在這種情況下,最好將指標初始化為 NULL。但是你應該避免這種情況。通常這種情況發生在舊的 C 語言只允許在塊的開頭宣告變數,并且當代碼的讀者在塊的開頭看到大量的變數宣告時無法想象在哪里以及如何使用這些變數。 .
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480147.html
上一篇:使用參考列印char值
下一篇:對自身的鏈表迭代沒有按預期作業
