2

Visual Studio 2012 で variable changes ブレークポイント修飾子をいじっていました。私の理解では、指定された変数値が以前の場所の実行から変更された場合、変数変更修飾子によりデバッガが中断されます。これは、メモリの上書きを絞り込むのに役立つと思います。私の非常に単純な C++ コードは次のとおりです。

int main ()
{
    printf("This program converts upper case chars to lower and vice versa\n");

    char str[20]="lowercase";;

    int i;

    for (i=0; i < strlen(str); i++)
    {
        if (str[i]>=97 && str[i]<=122)
        {
            str[i]-=32;
        }
        else
        {
            str[i]+=32;
        }
    }

    str[1] = 'o';
    printf("%s\n",str);
    system("PAUSE");
}

今、2行に条件付きブレークポイントを設定しました

  • str[i]=str[i]-32
  • printf("%s\n", str)

配列strが変更されたときにヒットします。これを行うには、場所のブレークポイントを設定し、右クリックして「条件」を選択し、条件テキスト ボックスに str,20 を入力します。最後に、"has changed" ラジオ ボタンを選択します。

今私が見ているのはこれです:

ブレークポイントは行で毎回ヒットされますが、行str[i]-=32では決してヒットされず、そのprintf("%s\n", str)理由が知りたいです。ステートメントの前の行のために明らかに配列が変更されているprintfのに、なぜブレークポイントにヒットしないのでしょうか?

ここで何が欠けていますか?

4

1 に答える 1

1

そのメモリが読み取られるのではなく、書き込まれるときにのみ壊れています。関数 printf はそのメモリのみを読み取ります。

于 2012-11-05T23:12:19.773 に答える