char *ft_strjoin(int size, char **strs, char *sep)
{
int full_length;
int index;
char *read_head;
char *string;
if (size == 0)
return ((char *)malloc(sizeof(char)));
full_length = ft_compute_final_length(strs, size, ft_str_length(sep));
if (!(string = (char *)malloc((full_length + 1) * sizeof(char))))
return (0);
read_head = string;
index = 0;
while (index < size)
{
ft_strcpy(read_head, strs[index]);
read_head += ft_str_length(strs[index]);
if (index < size - 1)
{
ft_strcpy(read_head, sep);
read_head += ft_str_length(sep);
}
index++;
}
*read_head = ' ';
return (string);
}
当我看到其他代码时,我想知道其中的部分。
read_head = string;
我更改了只使用已分配指针的代码。
在这种情况下,
string
因此,出现的错误是";被释放的指针没有被分配";
我不明白为什么我必须用另一个指针来指向另一个指示器?
发生这种情况是因为对strcpy的指针和分配的指针不同吗?
对于初学者,此语句
if (size == 0)
return ((char *)malloc(sizeof(char)));
没有意义,因为函数返回一个指向未初始化内存的指针。也许你是说
if (size == 0)
return (char *)calloc( 1, sizeof(char));
也就是说,函数将返回一个指向空字符串的指针。
在函数中,指针read_head
正在更改,例如在以下语句中
read_head += ft_str_length(strs[index]);
也就是说,在以这种方式使用它之后,它将不会指向最初分配的内存。从这句话中可以看出
*read_head = ' ';
在while循环之后,指针指向构建字符串的终止零。
因此,在免费通话中使用它会出现错误。
所以这个声明
read_head = string;
允许在指针string
中保留所分配的动态存储器的地址,并使用将被改变的中间指针read_head
。。
为什么在这种情况下我不能使用分配的指针?
不能直接使用string
但必须使用额外的read_head
变量的原因是因为您在循环中更改了read_head
(即read_head += ...
(。如果你直接在string
上这样做,你会遇到问题,因为你需要知道string
的malloc
ed值,这样你以后才能调用free
。
错误代码的简单示例:
char *string = malloc(...);
string += someValue; // Change the value of string
free(string); <-------- ERROR because the value of string changed
优秀代码的简单示例:
char *string = malloc(...);
char *read_head = string; // Give read_headthe same value as string
read_head += someValue; // Change the value of read_head
free(string); <-------- FINE because the value of string did NOT change