C:如何释放已分配字符串的初始部分?

C:如何释放已分配字符串的初始部分?,c,string,malloc,free,C,String,Malloc,Free,如何将字符串释放到某一点?例如,如果我有: char *s = (char *)malloc(sizeof(char) * 21); s[20] = '\0'; int i = 0; while (i < 21) { s[i] = i + 'a'; i++; } 有没有办法将s释放到s+10或第一个\0 有没有办法将s释放到s+10或第一个\0 不,至少不在标准库中 有realloc,但不能保证“免费s到s+10或第一个\0” 有没有办法将s释放到s+10或第一个\0 不

如何将字符串释放到某一点?例如,如果我有:

char *s = (char *)malloc(sizeof(char) * 21);
s[20] = '\0';
int i = 0;
while (i < 21)
{
    s[i] = i + 'a';
    i++;
}
有没有办法将
s
释放到
s+10
或第一个
\0

有没有办法将
s
释放到
s+10
或第一个
\0

不,至少不在标准库中

realloc
,但不能保证“免费
s
s+10
或第一个
\0

有没有办法将
s
释放到
s+10
或第一个
\0

不,至少在标准库里不在


realloc
,但不能保证“免费
s
s+10
或第一个
\0

由于
s
已由系统分配,您可以对其执行
realloc
以缩短大小:

s = realloc(s, 11);
但是,如果不释放其余区域,则无法释放已分配区域的开始部分,这是不可能的。使用
memmove
realloc
移动数据并随后减小大小

试图释放未分配的指针,或分配的指针加上偏移量,会导致未定义的行为

您可以这样做(正如您自己建议的,但问题已解决:):

现在
s
指向字符串的末尾

不带strdup但仅使用标准函数的备选方案(有忘记空终止字符的风险):

而我一开始暗示的
memmove
解决方案(避免分配/释放,但偏移量/大小更难计算):


由于系统已分配了
s
,因此您可以对其执行
realloc
以缩短大小:

s = realloc(s, 11);
但是,如果不释放其余区域,则无法释放已分配区域的开始部分,这是不可能的。使用
memmove
realloc
移动数据并随后减小大小

试图释放未分配的指针,或分配的指针加上偏移量,会导致未定义的行为

您可以这样做(正如您自己建议的,但问题已解决:):

现在
s
指向字符串的末尾

不带strdup但仅使用标准函数的备选方案(有忘记空终止字符的风险):

而我一开始暗示的
memmove
解决方案(避免分配/释放,但偏移量/大小更难计算):


不,你可以用realloc释放末端。免费到底是什么意思?与问题无关,但请注意,在
中,while(s[i]!='\0')
您正在假设分配的内存包含什么。任何高达您专门用
s[20]='\0'设置的字节的内容可以是
0
。你有未定义的行为是的。。。我在写一个随机的例子。。。刚刚更改了它。@tuple\u cat:在同一区域中,
sizeof(char)
始终为1.No。您可以使用realloc释放末端。免费到底是什么意思?与问题无关,但请注意,在
中,while(s[i]!='\0')
您正在假设分配的内存包含什么。任何高达您专门用
s[20]='\0'设置的字节的内容可以是
0
。你有未定义的行为是的。。。我在写一个随机的例子。。。刚刚更改了它。@tuple\u cat:在同一个区域中,
sizeof(char)
始终为1。类似的操作是否有效<代码>字符*c=strdup(s+10);免费(s&s);s=strdup(c);免费(&c)
可能,但将
&
放在
免费
中。我将编辑我的答案以包含您的代码,它会解决它(既然您接受了它:)@CosminSerdean
char*c=strdup(s+10);免费的;s=c就是你所需要的一切。@AndrewHenle这就是心灵感应,我在编辑中发现了很多。请注意,
strdup()
不是由标准定义的。类似的东西可以用吗<代码>字符*c=strdup(s+10);免费(s&s);s=strdup(c);免费(&c)
可能,但将
&
放在
免费
中。我将编辑我的答案以包含您的代码,它会解决它(既然您接受了它:)@CosminSerdean
char*c=strdup(s+10);免费的;s=c是您所需要的一切。@AndrewHenle这就是心灵感应,我在编辑中了解了很多。请注意,
strdup()
不是标准定义的。
char *c = strdup(s + 10);
free(s);
s = c;
char *c = malloc(strlen(s) - 10 + 1);
strcpy(c,s + 10);
free(s);
s = c;
int offset = 10;
int size = strlen(s) - offset;
memmove(s,s+offset,size);
s[size]='\0';  // null-terminate
s = realloc(s,size+1);  // adjust size after null-termination