如何在 c 中"clear"数组为较小的数组腾出空间?



>我在 C 中有一个数组,假设它是

**arr = malloc(100 * sizeof(char*));

通过一些函数,我以这样一种方式填充这个数组,它最终是

arr = {"first", "second", "third", "fourth", ... "tenth"};

现在,如果我想重新填充它,以便它是

arr = {"1st", "2nd", "3rd"}; //Desired outcome

相反,它显示为

arr = {"1st", "2nd", "3rd", "fourth", "fifth", ... "tenth"}; //Actual outcome

我确定我的代码是错误的,并且我从空填充它的函数很好,但我只想找到一种方法来擦除它。我尝试了free(),但我要么用错了,要么这不是我应该使用的。

你们中是否有人有一个函数,不仅可以将字符串设置为"",而是完全根除它?


对于所有评论和回答的人,谢谢。

我所做的是使用文本文件、strtok 和 strdup 将文件中的单词读取到char双指针中。我不希望在"数组"中存储超过 5000 个单词,即使我的文件是 5001+ 个单词。

我做到了。我成功地用文件中的字符串填充了内存。但是,如果我改变主意并尝试用较小的文件(~30 个单词)填充内存,它会更改前 30 个并保留剩余的 4970 个,当我希望它们不存在时。

您可以使用 realloc 函数更改 arr 变量的容量:arr = realloc(arr, 3 * sizeof(char*))- 为 3 个元素重新分配内存。然后你应该将这 3 个元素分配给你的 arr

使用realloc函数:

语法:void *realloc(void *ptr, size_t size);

realloc() 函数将 ptr 指向的内存块的大小更改为字节大小。 内容在从区域开始到新旧大小的最小值的范围内保持不变。 如果新大小大于旧大小,则不会初始化添加的内存。 如果 ptr 为 NULL,则对于所有大小值,调用等效于 malloc(size);如果大小等于零,并且 ptr 不是 NULL,则调用等效于 free(ptr)。 除非 ptr 为 NULL,否则它一定是通过之前对 malloc()、calloc() 或 real-loc() 的调用返回的。 如果指向的区域被移动,则执行 free(ptr)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *arr = malloc(sizeof(strlen(arr)) + 1);
strcpy(arr, "Hello World!");
char *arr_new = realloc(arr, sizeof(strlen(arr_new)) + 1);
strcpy(arr_new, "Hello!");
if(arr != NULL) {
free(arr);
// Free whatever used
}
return 0;
}

最新更新