如何解决为什么在这种情况下我不能使用分配的指针?
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 = '\0';
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 = '\0';
在 while 循环之后,指针指向构建字符串的终止零。
因此在免费调用中使用它会发出您遇到的错误。
所以这个声明
read_head = string;
允许在指针 string
中保留已分配动态内存的地址,并使用将要更改的中间指针 read_head
..
为什么在这种情况下我不能使用分配的指针?
您不能直接使用 string
而必须使用额外的 read_head
变量的原因是因为您在循环中更改了 read_head
(即 read_head += ...
)。如果您直接在 string
上这样做,您会遇到问题,因为您需要知道 malloc
的 string
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。