0

質問を正しく表現していない可能性がありますが、次のコードで申し訳ありません。

int main() {
char* a=new char[5];
a="2222";
a[7]='f';     //Error thrown here
cout<<a;
}

プログラムで a[7] にアクセスしようとすると、a[7] が割り当てられていないため、エラーが発生します。

しかし、クラスで同じことをすると:

class str
{
public:
    char* a;
    str(char *s) {
        a=new char[5];
        strcpy(a,s);
    }
};
int main()
{
    str s("ssss");
    s.a[4]='f';s.a[5]='f';s.a[6]='f';s.a[7]='f';
    cout<<s.a<<endl;
    return 0;
}

コードは機能し、文字「abcdfff」を出力します。最初のプログラムでは割り当てられなかった a に char[5] しか割り当てられていない場合、コード内の a[7] などにアクセスするにはどうすればよいでしょうか。

4

4 に答える 4

3

最初のケースでは、エラーがあります:

int main() 
{
    char* a=new char[5];   // declare a dynamic char array of size 5
    a="2222"; // assign the pointer to a string literal "2222" - MEMORY LEAK HERE
    a[7]='f';     // accessing array out of bounds!
    // ...
}

メモリリークを作成し、未定義の動作が未定義である理由を尋ねています。

2 番目の例は、未定義の動作が未定義である理由を繰り返します。

于 2013-09-19T17:50:15.067 に答える
1
int main() {
  char* a=new char[5];
  a="2222";
  a[7]='f';     //Error thrown here
  cout<<a;
}

プログラムで a[7] にアクセスしようとすると、a[7] が割り当てられていないため、エラーが発生します。

いいえ、書き込み保護されているメモリにアクセスすると、メモリ エラーが発生します。これaは、 が の書き込み専用メモリを指しているためです"2222"。偶然にも、その文字列の末尾の 2 バイト後も書き込み保護されています。で使用したものと同じstrcpyものを使用したclass str場合、メモリ アクセスは、割り当てられたメモリの後にいくつかの「ランダムな」データを上書きしますが、同じ方法で失敗することはほとんどありません。

割り当てたメモリ外のメモリにアクセスすることは、実際には無効です (未定義の動作)。コードが生成され、その上で実行されるコンパイラ、C および C++ ランタイム ライブラリ、および OS は、そのようなことをすべて検出する保証はありません (メモリにアクセスするすべての操作をチェックするには非常に時間がかかるため)。しかし、割り当てられたもの以外のメモリにアクセスすることは「間違っている」ことが保証されています - それは常に検出されるわけではありません.

于 2013-09-19T17:59:14.977 に答える
1

他の人が言ったように、それは未定義の動作です。ポインターに割り当てられたメモリの範囲外のメモリに書き込むと、いくつかのことが発生する可能性があります

  1. 割り当てられているが未使用で、これまでのところ重要ではない場所を上書きします
  2. プログラムにとって重要なものを格納するメモリの場所を上書きすると、その時点で自分のメモリが破損しているため、エラーが発生します
  3. アクセスが許可されていないメモリの場所 (プログラムのメモリ空間から何か) を上書きすると、OS がフリークアウトし、「AccessViolation」などのエラーが発生します。

特定の例では、メモリが割り当てられる場所は、変数の定義方法と、プログラムを実行するために他のメモリを割り当てる必要があることに基づいています。これは、何らかのエラーが発生する確率、またはエラーがまったく発生しない確率に影響を与える可能性があります。しかし、エラーが表示されるかどうかにかかわらず、割り当てられたメモリ空間からメモリ位置にアクセスしないでください。他の人が言ったように、それは未定義であり、エラーと混合した非決定論的な動作が発生します。

于 2013-09-19T17:55:37.053 に答える