我的CS教授給我們這個任務。基本上我們有這兩個全球指針未初始化,*min_ptr, *max_ptr
。我們寫這個void spray_paint(char *x, int sz, char tok, char *t)
函數,它取值爲tok並放入內存中的某個地方,從x
到x+sz-1
。 char *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上試了它,但問題是要麼我沒有訪問我選擇的隨機位置,要麼我不知道我應該選擇哪個位置不會影響程序,不會被其他意外操作所改變。
如果你的指針是全局的並且沒有被顯式初始化,它們保證是零初始化的,即使在C89中也是如此。 – jamesdlin