当我使用malloc
分配数组时,有没有办法只释放数组的第一个元素?
一个小例子:
#include <stdlib.h>
#include <string.h>
int main() {
char * a = malloc(sizeof(char) * 8);
strcpy(a, "foo bar");
// How I would have to do this.
char * b = malloc(sizeof(char) * 7);
strcpy(b, a+1);
free(a);
free(b);
}
有没有办法只释放a
的第一个字符,以便我可以使用a+1
使用字符串的其余部分?
答案 0 :(得分:5)
如果要删除a
的第一个字符,可以使用memmove()
将字符串中的其余字符向左移动1,然后使用{{1}如果需要缩小分配:
realloc()
@chux在good points中制作了几个the comments。
首先,不要退出#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char * a = malloc(sizeof(char) * 8);
strcpy(a, "foo bar");
puts(a);
size_t rest = strlen(a);
memmove(a, a+1, rest);
/* If you must reallocate */
char *temp = realloc(a, rest);
if (temp == NULL) {
perror("Unable to reallocate");
exit(EXIT_FAILURE);
}
a = temp;
puts(a);
free(a);
return 0;
}
中的失败,最好只是继续而不将realloc()
重新分配给temp
;毕竟,a
确实指向了预期的字符串,分配的内存只会比必要的大一点。
其次,如果输入字符串为空,则a
将为0.这会导致rest
出现问题。一种解决方案是在修改realloc(a, rest)
指向的字符串之前检查rest == 0
。
以上代码的稍微更一般的版本包含以下建议:
a
答案 1 :(得分:0)
有没有办法释放
的第一个字符
没有。你不能释放a
的第一个字符,因为它是char类型。只有malloc
族函数返回的指针才能被释放。
你可以做到这一点。
char * a = malloc(sizeof(char) * 8);
strcpy(a, "foo bar");
char * b = malloc(strlen(a));
strcpy(b, a+1);
free(a);