質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

解決済

c言語 free(): invalid pointer Aborted (core dumped)

pocomi
pocomi

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

4回答

0評価

0クリップ

978閲覧

投稿2022/03/06 15:41

編集2022/03/09 00:00

現在c言語のコードを書いてるのですが、コンパイルしようとするときに、
free(): invalid pointer
Aborted (core dumped)
っていうエラーメッセージが出てきます。

valgrindで調べてみたところ、どうやらこの関数に原因があるみたいですが、
原因がなかなか発見できません。直すべき点や解決方法などありましたら教えてほしいです。

C

HEAP SUMMARY: ==5996== in use at exit: 26 bytes in 5 blocks ==5996== total heap usage: 10 allocs, 8 frees, 357 bytes allocated ==5996== ==5996== 9 bytes in 4 blocks are definitely lost in loss record 1 of 2 ==5996== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==5996== by 0x10B84D: my_substr (my_substr.c:26) ==5996== by 0x10AEF8: ssplit (my_split.c:57) ==5996== by 0x10AFEE: my_split (my_split.c:79) ==5996== by 0x109255: main (main.c:93) ==5996== ==5996== LEAK SUMMARY: ==5996== definitely lost: 9 bytes in 4 blocks ==5996== indirectly lost: 0 bytes in 0 blocks ==5996== possibly lost: 0 bytes in 0 blocks ==5996== still reachable: 17 bytes in 1 blocks ==5996== suppressed: 0 bytes in 0 blocks ==5996== Reachable blocks (those to which a pointer was found) are not shown. ==5996== To see them, rerun with: --leak-check=full --show-leak-kinds=all

C

char *my_substr(char const *string, unsigned int start, size_t len) { char *res; size_t size; char *tmp; char *dup_put; char *tmp_dup; if (string == NULL) return (NULL); size = my_strlen(string); if (size < start) { dup_put = my_strdup(""); return (dup_put); } tmp = res; if (size < len) { len = size; } res = (char *)malloc(sizeof(char) * (len + 1)); if (res == NULL) return (NULL); my_strlcpy(res, string + start, len + 1); free(tmp); return (res); } static char **ssplit(char **res, const char *str, size_t col, const char c) { size_t i; size_t j; size_t len; char **tmp; i = 0; j = -1; while (++j < col) { tmp = res; while (str[i] == c) i++; len = my_strup(str + i, c); res[j] = my_substr(str + i, 0, len); if (res[j] == NULL) return (my_clear(res, j)); i += len; } res[j] = NULL; free(tmp); return (res); } char **my_split(char const *str, char c) { char **ss; size_t count; char **put_ssplit; if (!str) return (NULL); count = my_word_count(str, c); ss = (char **)malloc(sizeof(char *) * (count + 1)); if (!ss) return (NULL); put_ssplit = ssplit(ss, str, count, c); return (put_ssplit); } int main(int argc, char **argv) { char *map_read; char **after_split; int fd; int lem_i; fd = open(argv[1], O_RDONLY); while(map_read != NULL) { map_read = get_line(fd); after_split = my_split(map_read, ' '); lem_i = 0; while(after_split[lem_i] != NULL) lem_i++; printf("%s\n", after_split[lem_i]); } free(map_read); }```

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

pocomi

2022/03/06 16:00 編集

static char **ssplit(char **res, const char *str, size_t col, const char c) { size_t i; size_t j; size_t len; char **tmp; i = 0; j = -1; while (++j < col) { tmp = res; //ここで一度tmpの方に代入してます。 while (str[i] == c) i++; len = my_strup(str + i, c); res[j] = my_substr(str + i, 0, len); if (res[j] == NULL) return (my_clear(res, j)); i += len; } res[j] = NULL; free(tmp); return (res); } char **my_split(char const *str, char c) { char **ss; size_t count; char **put_ssplit; if (!str) return (NULL); count = my_word_count(str, c); ss = (char **)malloc(sizeof(char *) * (count + 1)); if (!ss) return (NULL); put_ssplit = ssplit(ss, str, count, c); return (put_ssplit); }
jimbe

2022/03/06 17:29 編集

追加・修正したコードでしたら、ご質問を編集してください。コメントも編集できます。 また、インデントにタブとスペースが混在しているとガタガタになってしまいます。予めインデントをどちらかに統一されると華麗になると思います。
pocomi

2022/03/07 09:27

使い始めたばかりで、色々と分かってなくてアドバイスありがとうございます!

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。