我的 CS 教授给了我们这个任务。基本上我们有这两个未初始化的全局指针,*min_ptr, *max_ptr
. 我们正在编写这个函数,它获取 tok 的值并从tovoid spray_paint( char *x, int sz, char tok, char *t )
开始放入内存中的某个位置。只是出于调试目的的一些随机事物。用于跟踪我们打印的内容的范围。但是,我无法初始化前两个指针。起初,我试图检查它们是否被初始化为 NULL,但我意识到它们仅在 C99 之后默认初始化为 NULL,我的教授说如果没有指定,你不能假设它们被初始化为 NULL,并且我们只能访问x
x+sz-1
char *t
*min_ptr, *max_ptr
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
,我们只需要检查是否有这种奇怪的东西就可以知道之前是否调用过子程序。这就引出了另一个问题,一个不返回任何内容的子程序是否可以进行一些更改,即使在子程序终止后仍保留在那里?我在 Xcode 上使用 C 进行了尝试,但问题是我无法访问我选择的随机位置,或者我不知道我应该在哪里选择不会影响程序并获胜的位置不会被其他意外操作更改。