2017-07-06 7 views
-1

これは私のc++コードのスニペットで使用されていますが、(Visual Studioで)初期化されていない可能性がありますバッファ

char buff[512]; 
memset(buff, ' ', sizeof(buff)); 
GetModuleFileName(NULL, buff, _MAX_PATH); 
char *file = strrchr(buff, '.'); 

に思えbuff最初の行に初期化されます。しかし、私はVisual Studioからこれを取得します(これは警告で、エラーではなく、この警告を削除します)。あなたはこのようなbuff用プレーンchar*ポインタを使用しているように見えます

+3

「buff」はどのように宣言しましたか? – user0042

+0

'バフが最初の行で初期化されたようです'いいえ、それはありません。 'buff'はポインタか配列ですか?それがポインタの場合は、スペースを割り当ててください。 「新」と? –

+0

初期化は宣言のポイントで行われます。 –

答えて

2

:代わりに

char buff[_MAX_PATH]; 

memset()

char* buff; 

は、バッファ・ポインタのための任意のメモリを割り当てません。


はまた、あなたも初期化ポインタ使用することができます

char* buff = new[_MAX_PATH]; 

をしかし、その後

delete [] buff; 

を呼び出すことを忘れないでください、とsizeof()はあなたのサイズを与えないことを割り当てられた配列ではなくポインタ変数自体のサイズのみです。

も、より良い代替手段が使用することですstd::vector<char>代わり:

あなたが正しくてもそれを使用するためにいくつかのより多くのコードを変更する必要が
std::vector<char> buff(_MAX_PATH,'\0'); 

:あなたは初期化する必要があります。また

GetModuleFileName(NULL, buff.data(), _MAX_PATH); 
char *file = strrchr(buff.data(), '.'); 

空白ではなくNUL文字を含むバッファ(' '):

memset(buff, '\0', sizeof(buff)); 
      // ^^ 
+0

"しかし、 ' delete [] buff; '"を呼び出すか、または単に 'std :: vector'やスマートポインタを使って手動でクリーンアップすることを忘れることを忘れないでください。 –

+0

@Jesperもちろん、より良い選択肢になるでしょうが、もちろんOPのコードをもっと変更する必要があります。 – user0042

+0

私はちょうど良い答えは存在するときに良い選択肢を言及すべきだと信じて起こった:)答えは、教育するための絶好の機会です。 –