C 释放字符串直到空终止符

C 释放字符串直到空终止符,c,string,malloc,dynamic-memory-allocation,free,C,String,Malloc,Dynamic Memory Allocation,Free,假设我有一个结构 struct 福{ 字符*p1; char*p2; char*p3; }傅; 我已经分配了struct malloc分配的字符串行 #包括 #包括 char temp[]=“这是字符串” char*allocated_temp=malloc(sizeof(temp)); strcpy(分配的温度、温度); 结构富吧; bar.p1=strtok(分配温度“”); bar.p2=strtok(空,“”); bar.p3=strtok(空,“”); 我想释放p1,而不释放p2和

假设我有一个结构

struct
福{
字符*p1;
char*p2;
char*p3;
}傅;
我已经分配了struct malloc分配的字符串行

#包括
#包括
char temp[]=“这是字符串”
char*allocated_temp=malloc(sizeof(temp));
strcpy(分配的温度、温度);
结构富吧;
bar.p1=strtok(分配温度“”);
bar.p2=strtok(空,“”);
bar.p3=strtok(空,“”);
我想释放
p1
,而不释放
p2
p3
指向的其他内存。将无法工作,因为将首先释放
p3
,我正在寻找一种更为优雅的解决方案,而不是在没有第一部分的情况下将结构复制到新结构,或者将其他两个字符串重新分配到不同的地址

这个问题有什么好的解决办法


(澄清一下,当我说我想释放
p1
时,我指的是字符串的
“this\0”
部分。

使用标准工具(
malloc
等)无法解决您的问题。您只能以较小的大小释放
realloc()
-ing分配的内存末端

如果要以这种方式释放
p1
,必须首先将数据移动到分配块的开头,更新指针(p2和p3),然后调用
realloc()


最好的方法可能是更改程序,以便分别malloc p1、p2和p3。

这看起来像是XY问题。为什么要释放数组的一部分?@klutt是的,我要释放内存块的第一部分(第一个空终止符之前的部分)。什么是XY问题?XY问题:那么,当你想忽略它时,为什么不直接使用
p2
?你使用的
strtok()
是不正确的。
bar.p1=strtok(allocated_temp,”);
第一行可以,但后面的行
bar.p2=strtok(allocated_temp,NULL);
是错误的。它们应该是
bar.p2=strtok(NULL,“”;
正在分析的字符串被替换为
NULL
,而不是分隔符字符串。如果要以这种方式释放p1,必须首先将数据移动到分配块的开头,更新指针(p2和p3),然后调用realloc()。即使这样,如果输入字符串很短,也可能不值得这么多开销。调用
realloc()
可能什么也不做,因为由于对齐要求,大多数堆实现以不小于8、16甚至32字节的块分配内存。更大的问题是必须跟踪原始指针,以便释放它later@AndrewHenle同意,因此我的最后一段。我只是提供一个算法正确的如果OP急需释放p1,则解决方案。