2

まず第一に、私は C++ プログラミングに関しては初心者です。昨日、私はかなり奇妙なことに遭遇しました。配列を指すポインターを介して配列の長さを決定しようとしていました。sizeofがうまくいかなかったので、Googleで少し検索したところ、このWebサイトにたどり着き、不可能であるという答えが見つかりました。代わりに、配列の最後のインデックスに範囲外の値を配置し、このインデックスに到達するまでカウンターをインクリメントする必要があります。最後のインデックスに含まれていた情報を上書きしたくなかったので、最後のインデックスの 1 つ後に範囲外の値を入れてみました。失敗すると思っていたのですが、なぜかそうではありませんでした。

私はどこかで間違いを犯し、配列が割り当てたよりも長いと思ったので、次のテストを行いました。

int a[4];
a[20] = 42;
std::cout << a[20];

出力はエラーなしで 42 です。なぜこれが機能するのですか?これはまったく有効ではないはずですよね?さらに興味深いのは、これが任意のプリミティブ型配列で機能するという事実です。ただし、std::string を使用すると、プログラムは即座に 1 で存在します。

何か案は?

4

2 に答える 2

6

あなたのシステムは、たまたま20 * sizeof(int)配列のアドレスから数バイト離れたメモリを使用していません。(最初から。)または、メモリはプロセスに属しているため、それをいじって自分で何かを壊すか、幸運な偶然の一致で何も壊すことができます。

要するに、それをしないでください:)

于 2012-05-13T12:45:22.773 に答える
0

理解する必要があるのは次のことだと思います:コンパイラ
を作成するときa[4]、4 つの整数にメモリを割り当て、最初の整数のアドレスを記憶しaます: ( *a == &(a[0]))。
あなたが読み書きするとき、コンパイラはあなたが境界内にあるかどうかをチェックしません(彼はもはやこの情報を持っていないからです)。次の方法で、配列の要求されたセルのアドレスに移動しますa[X] == &(a + sizeof(int) * X)
。C++ では、配列にアクセスするときに境界をチェックするのはプログラマの責任です。

于 2012-05-13T13:07:12.003 に答える