【C++】char配列をフォーマット指定で書き込むときの注意

C++(しーぷらすぷらす)

とあるC++ソースの不具合を調査をしていたところ、おかしな動きをしている箇所があった。

サンプルソース

// 変数宣言
char strA[] = "12345678";
char strB[8];
char ret[16];

// 初期化
memset(strB, 0x00, sizeof(strB));
memset(ret, 0x00, sizeof(ret));

// "12345678"をchar[8]の配列にコピー
memcpy(strB, strA, sizeof(strB));

// char[8]の内容をシングルクォーテーションで囲ってchar[16]の配列へ
sprintf(ret, "'%s'", strB);

// char[16]の配列を返す
return ret;

こんな感じのソースで、retの値に「’12345678’」が入ることを期待していたんだけど、変な値で返ってくる…。

サンプルソースで書いてしまえば一目瞭然なんだけど、実際のソースはもっと複雑なのと、SDLチェックも外されていたので、原因に気付くまで時間がかかった。

“【C++】char配列をフォーマット指定で書き込むときの注意” の続きを読む

【VC6.0 + Oracleリプレース】旧C++環境の用語メモ

仕事で20年位前のソースをいじることになった。

Visual C++6.0で作成されており、Oracleもすんごく古いバージョンだった。

そもそもC++自体触るのが、ほぼ初めてくらいの勢いで久しぶりだったので、まずは用語とかを抑えるためメモ。

“【VC6.0 + Oracleリプレース】旧C++環境の用語メモ” の続きを読む

【C++】ビルドにめっちゃ時間かかる…リビルドしてない?

新しく知ったことではないんだけど、とあるC++で作成されたプログラムの改修してるとき、毎回ビルドにめっちゃ時間かかっていた。

ここ数年、PCのスペックも上がったので、Visual Studioを使う場合、特に気にせず毎回「リビルド」していたんだけど、C++でソースが大量にあると、めっちゃ時間かかる…。

C++の場合は、ちょこちょこ動作確認するなら「ビルド」を選択して、変更ソースだけビルドしてる方が早いねって話。

【C++】VARTYPEについて

C++のVARIANT型のタイプ取得は、vt(VARTYPE)で参照できる。

VARTYPEの種類とデータの入り方について。

“【C++】VARTYPEについて” の続きを読む

【C++】メモリがロックされています。とか言われる

C++/メモリがロックされています。エラー

もらったソースを修正していたら、「メモリがロックされています。」とかいう例外エラーが発生して落ちる。

なんでだろうと思って調べてみると、C++で作成されている関数呼び出しで落ちているっぽい。

“【C++】メモリがロックされています。とか言われる” の続きを読む