C ++では、配列とポインターは同じものではありません。多くの場合、配列は暗黙的にポインターに変換できますが、配列タイプとポインタータイプは異なります。
あなたの場合、変数
char array[256];
タイプがありchar[256]
ます。を記述してそのアドレスを取得すると、タイプが。である&array
256の配列へのポインタを取得します。これは同じではありません。これは実際には良いことです。変換を実行できるとしたら、これを実行するとどうなりますか?char
char (*)[256]
char**
char array[256];
char** ptrPtr = &array; // Not legal!
*ptrPtr = new char[256];
この場合、3行目はarray
、256要素の新しい配列を指すように「再割り当て」します。ただし、array
ポインタではありません!この操作は無意味です。
書き込み時に奇妙なデバッガエラーが発生した理由
char array[256];
char** ptrPtr = (char**) &array; // Legal, but Bad Times!
*ptrPtr = new char[256];
あなたが入れたキャストは未定義の振る舞いをもたらすということです。256個の実際のchar
オブジェクトの配列へのポインタが実際には。へのポインタであるかのように見せかけていますchar
。これは無意味なキャストなので、あなたがそれをするとき、すべての賭けはオフになります。
一方、次のchar*
ような変数を明示的に導入した場合:
char array[256];
char* ptr = array;
char** ptrPtr = &ptr;
その後、すべてが大丈夫です。char*
2行目では、の最初の要素を指すポインタ(実際のタイプ)を作成しますarray
。3行目では、その新しいポインターへのポインターを作成します。あなたがそれから書くなら
*ptrPtr = new char[137];
その後、悪いことは何も起こりません。指している場所を変更しただけでptr
、破壊しませんでしarray
た。
お役に立てれば!