无法正确分配内存并且无法在我的 (ft_split) 函数中释放内存

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
  1. 当我输入一个字符串并在其末尾添加分隔符时,它会出现此错误
  2. \n
\n

字符串:

\n
\n

“存在还是不存在,这是一个问题”

\n
\n

错误:

\n
\n

分段故障

\n
\n
    \n
  1. 当我输入这个字符串时
  2. \n
\n

字符串:

\n
\n

“你好呀”

\n
\n

它会给出正确的答案,然后出现此错误

\n
\n

你好
\n有
\n分段错误

\n
\n
    \n
  1. 我只是不知道如何释放创建的内存分配,我已经包含了我认为正确的评论方式。
  2. \n
\n

我的代码:

\n
size_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} \n
Run Code Online (Sandbox Code Playgroud)\n

Niz*_*izz 1

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