1

このプログラムの何が問題になっていますか?

#include<iostream>
using namespace std;
void main()
{

    int n = 5;
    char* p = new char [n];
    int i;
    for(i=0;i<n;i++)
    {
        p[i] = 'A'+i;
    }
    cout<<p<<endl;
}

「ABCDE」ではなく「ABCDExxxx」と表示されるのはなぜですか? メモリ割り当ての何が問題になっていますか?

4

6 に答える 6

1

charこのように使用するためのストレージを割り当てればnewOKです。ただし、後で null 終端文字に関連する関数 (strlenつまり、これを出力するなど) でそれを使用する場合は、 a のストレージを割り当てるときにchar*、文字数+ 1をさらに を格納するために割り当てる必要があります\0。C 文字列は null で終了する必要があります。

「ABCDE」ではなく「ABCDExxxx」と表示されるのはなぜですか? メモリ割り当ての何が問題になっていますか?

あなたのデータはnullで終了していません('\0'最後に含まれていないため、文字'\0'がどこかで見つかるまでガベージを出力しています)。期待どおりに動作させるには、次のことができます。

int n = 5;
char* p = new char [n+1];
p[n]='\0';

for(i=0;i<n;i++)
{
    p[i] = 'A'+i;
         ^
        side note: this is OK, however if your p has been pointing to a string 
        literal, i.e. if it was defined as  char*p = "string literal\n";
        then according to section 2.14.5 paragraph 11 of the C++ standard,
        it would invoke undefined behavior:
        The effect of attempting to modify a string literal is undefined.
        so be aware :p !

}
cout<<p<<endl;

次に、ストレージの割り当てを解除することを忘れないでください

delete [] p;

他の人がコメントしたように、std::string代わりに使用することをお勧めします。

于 2013-09-07T15:04:13.340 に答える
0

endl が '\0' に到達すると、返されるため、char[] に '\0' がない場合は、それが見つかるまでメモリを読み取り続けます。

于 2013-09-07T15:13:26.300 に答える