在同一个指针中使用malloc()两次会发生什么?

在同一个指针中使用malloc()两次会发生什么?,c,C,我写了一个代码来按分隔符分割字符串。 我希望函数得到一个字符串并返回它的字符串 除了一件事,它实际上是有效的。 当我给字符串“test”时,它就工作了。 但当我给出字符串“1234 4567”时,我可以访问值“4567”,但不能访问值“1234”。(垃圾值。) 此外,“1234 2345 3456…”仅在第一个参数“1234”中产生垃圾值 我认为两次使用malloc()会导致同一个指针出现问题,但事实并非如此。 我的代码有什么问题 char **ft_set_char(char *str)

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

除了一件事,它实际上是有效的。 当我给字符串“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);
}
这是不正确的,因为它分配10个字节,而不是10个
char*
元素。应该是:

ret = malloc(10 * sizeof *ret);
其他不相关的问题,但应注意最佳做法:

  • 不要使用像
    10
    5
    这样的幻数。对于前者,至少使用
    #定义最大数组大小10
    。对于后者,您可以不断计算从原始
    str
    复制的字符串的确切大小,这将使您的代码在与较长的子字符串一起使用时更加健壮

两次导致malloc不会导致任何问题。这只是意味着stru_c现在指向新的联合内存空间。虽然我现在无法测试您的代码,而且看起来可能会出现很多问题,但在您提供的示例中,它实际上可能会起作用。。当然,您必须通过声明正确的大小来替换mallocs中的大小,即:10*sizeof(char*)和5*sizeof(char*)。您能否给出完整的代码,包括函数声明以及如何访问值?您的第一次
malloc
调用是错误的。应该是
malloc(10*sizeof*ret)
。没有调用代码,您的示例是不完整的。我想其中的一个核心错误就是在那里被发现。谢谢大家的评论。我不知道如何使用malloc。我为你们解决了这个问题。
ret = malloc(10 * sizeof *ret);