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

标签 c

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

除了一件事之外,它实际上是有效的。 当我给出字符串“test”时,它起作用了。 但是当我给出字符串“1234 4567”时,我可以访问值“4567”,但不能访问“1234”。 (垃圾值(value)。) 另外,“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);
}

最佳答案

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

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

ret = malloc(10 * sizeof *ret);

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

  • Don't cast the result of malloc
  • 不要使用像 10 这样的魔数(Magic Number)和5 。对于前者至少使用 #define MAX_ARRAY_SIZE 10 。对于后者,您可以计算出要从原始 str 复制的字符串的确切大小。 - 如果您的代码与较长的子字符串一起使用,这将使您的代码更加健壮。

关于c - 当我在同一个指针中使用 malloc() 两次时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60015357/

相关文章:

c++ - 指向数组重叠数组末端的指针

c - 保护共享数据并共享同一堆栈

c - Windows 控制台中的希腊字母

C、Little和Big Endian混淆

适合快速查找和简单增删改查的C数据结构

Cunit 测试可用内存两次

c - 将 char 传递给 strtok?

c# - 为什么驱动程序开发使用 C 而不是 C#?

c - 包含来自 glibc 的 header

c - 反转 32 位 unsigned int 位数字