2013-10-28 20 views
3

我的CS教授給我們這個任務。基本上我們有這兩個全球指針未初始化,*min_ptr, *max_ptr。我們寫這個void spray_paint(char *x, int sz, char tok, char *t)函數,它取值爲tok並放入內存中的某個地方,從xx+sz-1char *t只是一些隨機的東西,用於調試目的。 *min_ptr, *max_ptr用於跟蹤我們打印的東西的範圍。但是,我在初始化前兩個指針時遇到了問題。起初,我試圖檢查它們是否初始化爲NULL,但是我意識到它們在C99之後默認初始化爲NULL,並且我的教授說如果未指定它們,則不能假定它們已初始化爲NULL,並且我們只能訪問void spray_paint(char *x, int sz, char tok, char *t),而不是代碼中的其他任何地方。無論如何檢查兩個全局指針是否被初始化?或者有沒有辦法在第一次調用子程序時初始化它們,而不再重複它?如何檢查未初始化的指針C

char *min_ptr, *max_ptr; 
void spray_paint(char *x, int sz, char tok, char *t) 
{ 
char *marker = x + 3; 
char *painter = x; 
int k; 

//if (!min_ptr || !max_ptr) 
if (*marker != '~') 
{ 
    *marker = '~'; 
    min_ptr = x; 
    max_ptr = x + sz - 1; 
} 

for (k = sz - 1; k >= 0; k--) 
{ 
    *(painter+k) = tok; 
    if ((unsigned long) x < (unsigned long) min_ptr) 
     min_ptr = x; 
    else if ((unsigned long) x > (unsigned long) max_ptr) 
     max_ptr = x; 
} 

printf("%s\n",t); 
printf("\n"); 
} 

一個想到的就是找在存儲的地方,都子程序把一些奇怪的東西在那裏的第一時間,即*marker,我們只需要檢查是否有這樣一個奇怪的事情還是不知道子程序之前是否被調用過。這導致了另一個問題,即使在子程序終止後,一個不返回任何內容的子程序是否會做出一些更改,這些更改仍然存在?我在Xcode和C上試了它,但問題是要麼我沒有訪問我選擇的隨機位置,要麼我不知道我應該選擇哪個位置不會影響程序,不會被其他意外操作所改變。

+2

如果你的指針是全局的並且沒有被顯式初始化,它們保證是零初始化的,即使在C89中也是如此。 – jamesdlin

回答

1

你可以爲此使用一個靜態變量。

void spray_paint(char *x, int sz, char tok, char *t) 
{ 
    static int initialized = 0; 

    if (!initialized) 
    { 
     initialized = 1; 
     min_ptr = x; 
     max_ptr = x; 
    } 
    // ... 
} 
2

更換

char *min_ptr, *max_ptr; 

通過

char *min_ptr = 0, *max_ptr = 0; 

如果指針已被初始化,則無法驗證,但通過測試,如果它的值爲NULL或不是。

+1

這不是必須的,全局變量保證是空指針。 –

+0

不,他們不是。 – Espresso

+1

@Espresso是的,他們是如果他們有*靜態存儲持續時間*,哪些全局變量。 – jamesdlin

5

未明確初始化的全局變量(和靜態變量)保證爲算術類型爲0,指針類型爲空指針。自從C89以來這一直是真實的。

C89 §3.5.7 Initialization

如果具有靜態存儲持續時間的對象沒有明確初始化時,它被隱式地,如果每個具有算術型部件被分配0和每一個具有指針類型被分配一個構件初始化空指針常量。如果具有自動存儲持續時間的對象未被顯式初始化,則其值不確定。