微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在这种情况下我不能使用分配的指针?

如何解决为什么在这种情况下我不能使用分配的指针?

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 上这样做,您会遇到问题,因为您需要知道 mallocstringed 值,以便您可以稍后调用 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 举报,一经查实,本站将立刻删除。