malloc()
はメモリのブロックを割り当て、成功した場合はそのメモリへのポインタを返し、失敗した場合はNULLを返します。メモリのブロックのサイズは、malloc
バイト単位の's引数で指定されます。
演算子は、sizeof
引数のサイズをバイト単位で指定します。
char *someString = malloc(sizeof(char) * 50)
これにより、NULL文字を含まない49文字の文字列(Cスタイルの文字列はNULL('\0'
)文字で終了する必要があります)に十分なスペースが割り当てられsomeString
、そのメモリをポイントします。
意味がないのでmalloc(sizeof(char) * 2);
、質問のコードはである必要があるようです。sizeof(char) + 2
sizeof(char)
常に1(バイト)に等しいことが保証されていることに注意してください。ただし、他のタイプ(longなど)のメモリ表現はコンパイラによって異なる場合があります。
動的に割り当てられたメモリで(不)幸運になる方法は、割り当てたメモリの外で読み取り/書き込みを行おうとした場合です。
例えば、
char *someString = malloc(10);
strcpy(someString, "Hello there, world!");
printf("%s\n", someString);
最初の行は、9文字とNULL文字に十分なスペースを割り当てます。
2行目は、20文字(19 + NULL)をそのメモリスペースにコピーしようとします。これによりバッファがオーバーランし、隣接するメモリを上書きしたり、セグメンテーション違反が発生したりするなど、非常に機知に富んだものが発生する可能性があります。
たとえば、someStringのすぐ横にメモリが割り当てられていて、「Hello there、world!」の場合、3行目が機能する可能性があります。そのメモリスペースに遭遇すると、文字列に加えて次のメモリスペースにあるものがすべて出力される可能性があります。その2番目のスペースがNULLで終了した場合、それは停止します-そうでない場合を除きます。そうでない場合は、それはさまよって、最終的にはセグメンテーション違反になります。
この例は非常に単純な操作ですが、間違えるのは簡単です。Cは注意が必要です。注意してください。