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)
可能,但将&
放在免费
中。我将编辑我的答案以包含您的代码,它会解决它(既然您接受了它:)@CosminSerdeanchar*c=strdup(s+10);免费的;s=c代码>就是你所需要的一切。@AndrewHenle这就是心灵感应,我在编辑中发现了很多。请注意,strdup()
不是由标准定义的。类似的东西可以用吗<代码>字符*c=strdup(s+10);免费(s&s);s=strdup(c);免费(&c)
可能,但将&
放在免费
中。我将编辑我的答案以包含您的代码,它会解决它(既然您接受了它:)@CosminSerdeanchar*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