3

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

4

3 回答 3

7

未显式初始化的全局变量(和静态变量)保证0为算术类型,空指针为指针类型。自 C89 以来一直如此。

C89 §3.5.7 初始化

如果具有静态存储持续时间的对象未显式初始化,则它会被隐式初始化,就好像每个具有算术类型的成员都被分配了 0 并且每个具有指针类型的成员都被分配了一个空指针常量。如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。

于 2013-10-28T03:08:36.823 回答
2

代替

char *min_ptr, *max_ptr;

经过

char *min_ptr = 0, *max_ptr = 0;

您无法验证指针是否已初始化,但可以通过测试其值是否为 NULL。

于 2013-10-28T03:00:13.977 回答
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;
    }
    // ...
}
于 2013-10-28T02:59:42.790 回答