3

私の CS 教授は私たちにこの課題を与えます。基本的に、これら 2 つのグローバル ポインターは初期化されていません*min_ptr, *max_ptr。tok の値を取り、 tovoid spray_paint( char *x, int sz, char tok, char *t )から始まるメモリのどこかに入れるこの関数を書いています。デバッグ目的のためのランダムなものです。印刷したものの範囲を追跡するために使用されます。ただし、最初の 2 つのポインターの初期化に問題があります。最初は、NULL に初期化されているかどうかを確認しようとしていましたが、C99 以降のデフォルトでは NULL に初期化されるだけであることに気付きました。私たちはにしかアクセスできませんxx+sz-1char *t*min_ptr, *max_ptrvoid spray_paint( char *x, int sz, char tok, char *t )、コード内の他の場所ではありません。2 つのグローバル ポインターが初期化されているかどうかを確認する方法はありますか? または、サブルーチンが初めて呼び出されたときにそれらを初期化し、二度とそれを行わないようにする方法はありますか?

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"); 
}

1 つの考えは、メモリ内の場所を見つけて、サブルーチンに最初に奇妙なものを配置させることです。つまり*marker、そのような奇妙なものが存在するかどうかを確認して、サブルーチンが以前に呼び出されたかどうかを確認する必要があります。それは別の質問につながります.何も返さないサブルーチンは、サブルーチンが終了した後でもそこにとどまるいくつかの変更を行うことができますか? Cを使用してXcodeで試しましたが、問題は、選択したランダムな場所にアクセスできないか、プログラムに影響を与えずに勝った場所を選択する場所がわからないことです他の予期しない操作によって変更されることはありません。

4

3 に答える 3

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 に答える