てけもぐ Tech 忘備録

malloc(): invalid next size(unsorted) エラーの覚え書き

対象読者

C言語初心者

解決すること

このエラーメッセージから原因を探せるように残しておく

内容

C言語を使っていて、malloc()のエラーの原因を探すのに手間取りました。このエラー。

malloc(): invalid next size(unsorted)

原因はすごく単純なミスでしたけど、どんなテストケースでも起こるわけではないので、新しい機能を入れたことによるものなのか、対象としたテストケースだけに起こる問題なのか等々と区別するのに手間どります。前も同じエラーに時間をかけたので、原因だったものを2つほど書いておきます。

文字列メモリ確保に +1 するのを忘れる。

char *s = malloc(strlen(msg));  // ダメ!基本のキ

こんなの。構造体に malloc() を使ってて、sizeof()sizeo()、って打ってると、文字列になった時に sizeof() -> strlen() は気にしても、'\0' 文字の1バイト分忘れるやつ。これで、s[size] = '\0'; とか普通にやりますけど、運がいいと(?)エラー出ません。テスト対象が大きくなってきたりして初めてエラーになる。strlen("A")の結果は 1 ですけど、ヌル文字分必要なので、+1 が必要。基本中の基本ですが忘れることあり。

もう1つが、ヌル文字入れる時にメモリ範囲をオーバーする場合。文字列処理で1文字ずつループ中で処理していたりすうと、1バイト分領域をはみ出して書き込んだ時になるもの。こちらもすぐにエラーとして報告されるわけではなくて、テスト対象が大きくなりメモリの確保と開放を繰り返す様になると、発生するエラー。

前もやったなぁと思って検索しても、なかなか引っ掛からなかったので残しておきます。

Tags