gpt4 book ai didi

c - 释放数组的第一个元素

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:31 25 4
gpt4 key购买 nike

当我使用 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 使用字符串的其余部分?

最佳答案

如果要删除a的第一个字符,可以使用memmove()将字符串中剩余的字符向左移动1,如果需要,您可以使用 realloc() 来缩小分配:

#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;
}

更新

@chux 做了几个 good pointsthe comments .

首先,与其在 realloc() 失败时退出,不如简单地继续而不将 temp 重新分配给 a 可能更好;毕竟,无论如何,a 确实指向预期的字符串,分配的内存会比需要的大一点。

其次,如果输入字符串为空,则rest 将为0。这会导致realloc(a, rest) 出现问题。一种解决方案是在修改 a 指向的字符串之前检查 rest == 0

下面是上述代码的一个更通用的版本,其中包含了这些建议:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
char *s = "foo bar";
char *a = malloc(sizeof *a * (strlen(s) + 1));
strcpy(a, s);

puts(a);

size_t rest = strlen(a);

/* Don't do anything if a is an empty string */
if (rest) {
memmove(a, a+1, rest);

/* If you must reallocate */
char *temp = realloc(a, rest);
if (temp) {
a = temp;
}
}

puts(a);

free(a);

return 0;
}

关于c - 释放数组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45758354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com