我编写了一个代码来按分隔符分割字符串。 我希望该函数获取一个字符串并返回其分割后的字符串。
除了一件事之外,它实际上是有效的。 当我给出字符串“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/