質問が1つありました。C++ new * charは空ではありません
私はASIOでサーバーを開発しており、パケットは尖っています。
新しい文字(例:char * buffer = new char[128];
)を作成するときは、手動でnullにする必要があります。
で:
for(int i =0;i<128;i++)
{
buffer[i] = 0x00;
}
私が何か間違ったことをやって、その文字は明確ではないでしょうか?
質問が1つありました。C++ new * charは空ではありません
私はASIOでサーバーを開発しており、パケットは尖っています。
新しい文字(例:char * buffer = new char[128];
)を作成するときは、手動でnullにする必要があります。
で:
for(int i =0;i<128;i++)
{
buffer[i] = 0x00;
}
私が何か間違ったことをやって、その文字は明確ではないでしょうか?
あなたが初期化されていない値の配列をループする必要はありません。あなたは、動的にこのようなゼロの配列をインスタンス化することができます
char * buffer = new char[128](); // all elements set to 0
^^
割り当てられたメモリはクリアされません。代わりにランダムなものが含まれます。これがメモリ割り当ての仕組みです。 for
-loopを実行するか、memset
を使用して手動でクリアする必要があります。それがポインタであるので、あなたがそのようにそれを行う必要があります
:
for(int i = 0; i < 128; i++)
{
(buffer + i) = 0x00;
}
-1:コードが間違っています(0x00をrvalueに割り当てます)。アドバイスが間違っています(OPのコードはコンパイルされません)。 – milleniumbug
1. LHSを間接参照するのを忘れたので、r値に割り当てようとしています(コードはコンパイルされません)。 2 'buffer [i]'は言語標準で '*(buffer + i) 'と同じです。この文脈では、配列とポインタ*は言語標準ごとに異なりますが、ある程度互換性があります。 –
C++におけるnew演算子の呼び出しの方法の2種類があります - 初期化とゼロが初期化デフォルト。
コール(未定義の値のままにします)初期化をデフォルトに:
int * i = new int;
その設定がされてまで、この値を読み取るか、使用する未定義behavoirです。使用します(0に設定されます)zeroinitialiseする
:
int * i = new int();
また、これは配列で動作します:
int * i = new int[4]; // ints are not initialised, you must write to them before reading them
int * i = new int[4](); // ints all zero initialised
いくつかの詳細情報here
あなたの質問はすでに[[型名の後にかっこは新しいものと違いますか?](http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name -make-a-difference-with-new)。 – Troubadour