文字を格納できる限界を超えてもエラーにならない
こんにちは。今回、以下のコードを作成して、動的にメモリを確保しようとしています。使用しているのはVisual C++ 2008のC言語で、C99等と言った規格に準拠しているかどうかは不明です。
これは、まずメモリをmallocEx(内部でmalloc)で確保して文字を代入、それをさらにrealloc(内部でrealloc)で領域を増やして文字を追加、最後に出力してfree(内部でfree)する、というコードで、コードに直接矢印で示してありますが、わざとエラーの発生するコードを組み込んであるのですが、これが何の問題もなく処理されてしまいます。また、reallocExを実行すると、代入したイが不定のデータに変わってしまうようで、その後ロを代入するとイが消えてしまいます。
唯一正常に動くものは、freeExを実行後のポインタに代入しようとすると例外として処理されるところだけです。
ポインタを参照渡し等にしてもう少しコードをすっきりさせようとしていたのですが、結局メモリ操作がうまくいっていなかったようなので、freeEx関数以外は戻り値で戻すという形に戻しました。
------------------
実行するコード
------------------
char *test;
test = mallocEx( 1 * sizeof(char) ); ←エラーが発生するか確かめるために要素は1つだけ確保
strcpy( test,"イ" ); ←要素を1つしか確保していないのに2バイトの文字でエラーなし
printf("%s\n", test);
test = reallocEx( test, (4 + 1) * sizeof(char));
strcpy( test,"ロ" ); ←これを実行すると、前回代入したイが消える
printf("%s\n", test);
freeEx(&test);
//strcpy( test,"イロハ" ); ←これは例外処理で受け付けられない(正常)
keywait();
return 0;
------------------
使用する関数
------------------
void *mallocEx( size_t nSize )
{
void *tmp; /* malloc関数で割り当てたメモリへのポインタ */
tmp = malloc( nSize ); /* メモリを割り当てる */
/* メモリ割り当てに失敗した場合の処理 */
if( tmp == NULL ) {
printf( "\a\n<!> mallocEx関数内、malloc関数のエラー:\nメモリが不足しています。指定された数のメモリブロックが確保できませんでした。\n" );
return NULL; /* 生成失敗 */
}
return tmp; /* 生成成功 */
}
void *reallocEx( void *ptr, size_t nSize )
{
void *tmp; /* realloc関数で割り当てたメモリへのポインタ(安全確認用) */
/* ポインタを生成する型を判定する */
tmp = realloc( ptr, nSize ); /* メモリを再度割り当てる(安全のため(=NULLに備えて)内部ポインタ変数tmpで取得) */
/* メモリの再割り当てに失敗した場合の処理 */
if( tmp == NULL ) {
printf( "\a\n<!> reallocEx関数内、realloc関数のエラー:\nメモリが不足しています。指定された数のメモリブロックが確保できませんでした。\n" );
return NULL; /* 再割り当て失敗 */
}
return tmp; /* 再割り当て成功 */
}
void freeEx( void **ptr )
{
if( *ptr != NULL )
{
free( *ptr );
*ptr = NULL;
}
}
お礼
回答ありがとうございます。 まだ実行環境のイメージが曖昧ではありますが、疑問点に関しては解決出来たと思います。 1.関数のコードではなく、関数を呼ぶ下準備のコードを書く。 2.直接呼び出せない関数だから下準備がいる。 という事ですね。 サンク方式という言葉は下記の記事から見つけたものです。 http://mentai.2ch.net/prog/kako/957/957341074.html この80レス目なのですけど、あまり一般的な言い方ではないのですね。それに使い方も変則的のようです。