『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]
本の内容に従ってメモリ確保のコードを書いていたら、malloc関数で確保されるメモリ領域が引数で指定した通りにならないことが判明しました。
詳しく調べてはいませんが、引数が0以上であれば最低16バイトは確保されるようです。なおこれはclangでの検証結果であってgccなどではどうなっているのか不明です。
教科書等では収納するバイト数にヌル文字の1バイト分を加えた数を引数としましょうと教えているはずですが、実際は小さい数であればあまり意味がないということになります。
#include <cppstd.h>
#include <malloc/malloc.h>
int main() {
char* s = "abc";
char* t = "def";
char* r1;
char* r2;
char* r3;
cout << "strlen(s) " << to_string(strlen(s)) << endl;
cout << "strlen(t) " << to_string(strlen(t)) << endl;
r1 = (char*)malloc(strlen(s) + strlen(t) +1);
r2 = (char*)malloc(0);
r3 = (char*)malloc(10000);
int size1 = malloc_size(r1);
int size2 = malloc_size(r2);
int size3 = malloc_size(r3);
cout << "r1で確保されたサイズ " << to_string(size1) << endl;
cout << "r2で確保されたサイズ " << to_string(size2) << endl;
cout << "r3で確保されたサイズ " << to_string(size3) << endl;
strcat(r1, s);
strcat(r1, t);
cout << "r1 " << r1 << endl;
free(r1);
free(r2);
free(r3);
return 0;
}
--------------------------------------------------
出力
--------------------------------------------------
strlen(s) 3
strlen(t) 3
r1で確保されたサイズ 16
r2で確保されたサイズ 16
r3で確保されたサイズ 10240
r1 abcdef