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


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上这样做,你会遇到问题,因为你需要知道stringmalloced值,这样你以后才能调用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

最新更新