我的计算机科学教授给了我们这个任务。基本上,我们有两个未初始化的全局指针
*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)
,而无法访问代码中的其他地方。有没有办法检查这两个全局指针是否已初始化?或者有没有办法在第一次调用子例程时初始化它们,并永远不再进行初始化?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
,我们只需要检查是否存在这样奇怪的东西,就可以知道子程序是否被调用过。这引出了另一个问题:一个不返回任何内容的子程序是否可以进行一些更改,并且即使在子程序终止后这些更改仍然保留下来?我在使用C和Xcode时尝试过,但问题要么是我没有访问所选择的随机位置的权限,要么是我不知道应该选择哪个位置不会影响程序并且不会被其他意外操作改变。