Niz*_*izz 5 c malloc free heap-memory
我正在尝试创建一个ft_split函数,该函数应该:
\n\n使用 malloc 进行分配,并返回通过使用字符 \xe2\x80\x99c\xe2\x80\x99\nas 分隔符分割 \xe2\x80\x99s\xe2\x80\x99 获得的字符串数组。该数组必须以 NULL 指针结尾。
\n
我已将所有代码包含在下面的代码示例中,以及调试器给出错误之一的断点。
\n现在遇到以下问题:
\n字符串:
\n\n\n“存在还是不存在,这是一个问题”
\n
错误:
\n\n\n分段故障
\n
字符串:
\n\n\n“你好呀”
\n
它会给出正确的答案,然后出现此错误
\n\n\n你好
\n
\n有
\n分段错误
我的代码:
\nsize_t ft_strlen(const char *s)\n{\n size_t i;\n\n i = 0;\n while (s[i] != \'\\0\')\n {\n i++;\n }\n return (i);\n}\n\nchar *ft_strcpy(char *dest, const char *src)\n{\n int i;\n\n i = 0;\n while (src[i] != \'\\0\')\n {\n dest[i] = src[i];\n i++;\n }\n dest[i] = \'\\0\';\n return (dest);\n}\n\nchar *string_length(char const *str, char c, int i)\n{\n int j;\n char *string;\n\n j = 0;\n // when i try the debugger with the first string in the main function it goes\n // directly to this line and break.\n string = (char *)malloc((ft_strlen(str)) * sizeof(*string));\n if(!string)\n return (NULL);\n while (str[i] == c)\n i++;\n while (str[i])\n {\n *string = str[i];\n if (str[i + 1] == c || str[i + 1] == \'\\0\')\n {\n string++;\n j++;\n *string = \'\\0\';\n return (string - j);\n }\n string++;\n j++;\n i++;\n }\n return (0);\n}\n\nint count_strings(char const *str, char c)\n{\n int i;\n int count;\n int def;\n\n i = 0;\n count = 0;\n def = 1;\n while (str[i] == c)\n i++;\n while (str[i])\n {\n if (str[i] == c && def == 1)\n {\n i++;\n def = 0;\n }\n if (str[i] != c && def == 0)\n {\n count++;\n def = 1;\n }\n i++;\n }\n return (count);\n}\n\nint first_del(char const *str, char c, int i)\n{\n while (str[i] == c)\n i++;\n return (i);\n\n}\nchar **ft_split(char const *s, char c)\n{\n int count;\n int i;\n int len;\n int num_of_strings;\n char **split;\n char *string;\n char **it;\n\n i = 0;\n count = 0;\n num_of_strings = count_strings(s, c);\n split = (char **)malloc((num_of_strings + 1) * sizeof(char *));\n if (!split)\n return (NULL);\n split[num_of_strings + 1] = NULL;\n while (i <= num_of_strings)\n {\n count = first_del(s, c, count);\n string = string_length(s, c, count);\n len = ft_strlen(string);\n split[i] = (char *)malloc(len + 1);\n ft_strcpy(split[i], string);\n count += len;\n i++;\n free(string);\n string = NULL;\n }\n return (split);\n}\nint main(void)\n{\n char s[] = " To be or not to be that is the question ";\n char **split_strings = ft_split(s, \' \');\n for (int i = 0; i < 10; i++)\n printf("%s\\n", split_strings[i]);\n\n char s2[] = "Hello there";\n char **split_strings2 = ft_split(s2, \' \');\n for (int i = 0; i < 2; i++)\n printf("%s\\n", split_strings2[i]);\n} \nRun Code Online (Sandbox Code Playgroud)\n
string = (char *)malloc((ft_strlen(str) + 1) * sizeof(*string));
split = (char **)malloc((num_of_strings + 2) * sizeof(char *));
Run Code Online (Sandbox Code Playgroud)
释放主函数中的内存分配:
int i = 0;
while (split_strings && split_strings[i])
{
free (split_strings[i]);
i++;
}
free (split_strings);
Run Code Online (Sandbox Code Playgroud)
归功于 xing