首页 > 解决方案 > 当我在同一个指针中使用 malloc() 两次时会发生什么?

问题描述

我编写了一个代码来按分隔符拆分字符串。我希望函数获取一个字符串并返回它的字符串分割。

它实际上有效,除了一件事。当我给字符串“test”时,它起作用了。但是当我给出字符串“1234 4567”时,我可以访问值“4567”,但不能访问“1234”。(垃圾值。)也“1234 2345 3456 ...”仅在第一个参数“1234”中产生垃圾值。

我认为使用 malloc() 两次会导致同一个指针出现问题,但事实并非如此。我的代码有什么问题?

char    **ft_set_char(char *str)
{    
    int     i;
    int     j;
    int     k;
    char    *str_c;
    char    **ret;

    k = 0;
    j = 0;
    ret = (char **)malloc(10);
    str_c = (char *)malloc(5);
    i = 0;
    while (*(str + i) != '\0')
    {    
        if (*(str + i) == ' ')
        {
            *(str_c + k) = '\0';
            k = 0;
            *(ret + j) = str_c;
            j++;
            i++;
            str_c = (char *)malloc(5);
        }
        *(str_c + k) = *(str + i);
        i++;
        k++;
    }
    *(str_c + k) = '\0';
    *(ret + j) = str_c;
    *(ret + j + 1) = NULL;
    return (ret);
}

标签: c

解决方案


ret = (char **)malloc(10);

这是不正确的,因为它分配了 10 个字节而不是 10 个char *元素。它应该是:

ret = malloc(10 * sizeof *ret);

其他不相关的问题,但应注意最佳实践:

  • 不要投射结果malloc
  • 不要使用 和 之类的幻105。对于前者,至少使用一个#define MAX_ARRAY_SIZE 10. 对于后者,您可以保持计算要从原始字符串复制的字符串的确切大小str- 这将使您的代码更加健壮,以防它与更长的子字符串一起使用。

推荐阅读