如何将字符串释放到某个点?例如,如果我有:
char *s = (char *)malloc(sizeof(char) * 21);
s[20] = '\0';
int i = 0;
while (i < 21)
{
s[i] = i + 'a';
i++;
}
然后我在某个时候切断了字符串并存储了那一半:
*(s + 10) = '\0';
char *m = s + 11;
有没有办法将 s
释放到 s + 10
或第一个 \0
?
最佳答案
因为s
已经被系统分配了,你可以对其执行realloc
来缩短大小:
s = realloc(s, 11);
但是您不能在不释放其余部分的情况下释放已分配区域的开始,这是您做不到的。使用 memmove
和 realloc
移动数据并随后减小大小。
尝试释放
一个还没有分配的指针,或者一个分配的指针加上一个偏移量会导致未定义的行为。
你可以这样做(正如你自己建议的那样,但问题已解决:)):
char *c = strdup(s + 10);
free(s);
s = c;
所以现在 s
指向字符串的末尾。
没有 strdup
但仅使用标准函数的替代方案(存在忘记空终止字符的风险):
char *c = malloc(strlen(s) - 10 + 1);
strcpy(c,s + 10);
free(s);
s = c;
和我一开始暗示的 memmove
解决方案(避免分配/释放但偏移量/大小更难以计算):
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
关于C:如何释放已分配字符串的初始部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42425215/