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

标签 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 + 10) = '\0';
char *m = s + 11;

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

最佳答案

因为s已经被系统分配了,你可以对其执行realloc来缩短大小:

s = realloc(s, 11);

但是您不能在不释放其余部分的情况下释放已分配区域的开始,这是您做不到的。使用 memmoverealloc 移动数据并随后减小大小。

尝试释放一个还没有分配的指针,或者一个分配的指针加上一个偏移量会导致未定义的行为。

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

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/

相关文章:

c - C 中的字符串不以空字符结尾

当其他 channel (同一定时器)具有 i2c 备用功能时,我可以使用不同的定时器 channel 吗

javascript - 确定字符串中第一个字母的大小写(大写/小写)

java - 将整数显示为 Xs 的输出

由损坏的堆栈触发时捕获 SIGSEGV

java - 制作一个空心钻石,里面有一个单词

c - 释放分配的内存时堆损坏 (C)

c - 这个错误提示什么?

字符指针和 malloc

我可以通过为封闭结构分配更多空间来 "over-extend"数组吗?