現在c言語のコードを書いてるのですが、コンパイルしようとするときに、
free(): invalid pointer
Aborted (core dumped)
っていうエラーメッセージが出てきます。
valgrindで調べてみたところ、どうやらこの関数に原因があるみたいですが、
原因がなかなか発見できません。直すべき点や解決方法などありましたら教えてほしいです。
C
1HEAP SUMMARY: 2==5996== in use at exit: 26 bytes in 5 blocks 3==5996== total heap usage: 10 allocs, 8 frees, 357 bytes allocated 4==5996== 5==5996== 9 bytes in 4 blocks are definitely lost in loss record 1 of 2 6==5996== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) 7==5996== by 0x10B84D: my_substr (my_substr.c:26) 8==5996== by 0x10AEF8: ssplit (my_split.c:57) 9==5996== by 0x10AFEE: my_split (my_split.c:79) 10==5996== by 0x109255: main (main.c:93) 11==5996== 12==5996== LEAK SUMMARY: 13==5996== definitely lost: 9 bytes in 4 blocks 14==5996== indirectly lost: 0 bytes in 0 blocks 15==5996== possibly lost: 0 bytes in 0 blocks 16==5996== still reachable: 17 bytes in 1 blocks 17==5996== suppressed: 0 bytes in 0 blocks 18==5996== Reachable blocks (those to which a pointer was found) are not shown. 19==5996== To see them, rerun with: --leak-check=full --show-leak-kinds=all
C
1char *my_substr(char const *string, unsigned int start, size_t len) 2{ 3 char *res; 4 size_t size; 5 char *tmp; 6 char *dup_put; 7 char *tmp_dup; 8 9 if (string == NULL) 10 return (NULL); 11 size = my_strlen(string); 12 if (size < start) 13 { 14 dup_put = my_strdup(""); 15 return (dup_put); 16 } 17 tmp = res; 18 if (size < len) 19 { 20 len = size; 21 } 22 res = (char *)malloc(sizeof(char) * (len + 1)); 23 if (res == NULL) 24 return (NULL); 25 my_strlcpy(res, string + start, len + 1); 26 free(tmp); 27 return (res); 28} 29 30static char **ssplit(char **res, const char *str, size_t col, const char c) 31{ 32 size_t i; 33 size_t j; 34 size_t len; 35 char **tmp; 36 37 i = 0; 38 j = -1; 39 while (++j < col) 40 { 41 tmp = res; 42 while (str[i] == c) 43 i++; 44 len = my_strup(str + i, c); 45 res[j] = my_substr(str + i, 0, len); 46 if (res[j] == NULL) 47 return (my_clear(res, j)); 48 i += len; 49 } 50 res[j] = NULL; 51 free(tmp); 52 return (res); 53} 54 55char **my_split(char const *str, char c) 56{ 57 char **ss; 58 size_t count; 59 char **put_ssplit; 60 61 if (!str) 62 return (NULL); 63 count = my_word_count(str, c); 64 ss = (char **)malloc(sizeof(char *) * (count + 1)); 65 if (!ss) 66 return (NULL); 67 put_ssplit = ssplit(ss, str, count, c); 68 return (put_ssplit); 69} 70 71int main(int argc, char **argv) 72{ 73 char *map_read; 74 char **after_split; 75 int fd; 76 int lem_i; 77 fd = open(argv[1], O_RDONLY); 78 79 while(map_read != NULL) 80 { 81 map_read = get_line(fd); 82 after_split = my_split(map_read, ' '); 83 lem_i = 0; 84 while(after_split[lem_i] != NULL) 85 lem_i++; 86 printf("%s\n", after_split[lem_i]); 87 } 88 free(map_read); 89}```
回答4件