使用 malloc 设置字符串数组然后清除它

2023-12-26

我想使用 malloc 创建一个字符串数组,然后清除所有分配的内存,我相信我使用 malloc 是正确的,但当我尝试清除它时,我无法理解我做错了什么:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void print_arr(char* arr[]);
void clear_arr(char* arr[], int size);
int main()
{
    int number = 10;
    char **myarr = malloc((number+1)*sizeof(char*));
    for (int i = 0; i <= number; i++)
    {
        myarr[i]=NULL;
    }
    for (int i = 0; i < number; i++)
    {
        char str[] = "word";
        int len = strlen(str);
        myarr[i]=malloc((len+1)*sizeof(char));
        strcpy(myarr[i], str);
    }
    print_arr(myarr);
    clear_arr(myarr, number);
    print_arr(myarr);
    free(myarr);

   return 0; 
}
void print_arr(char* arr[])
{
    for (int i = 0; arr[i] != NULL; i++)
    {
        printf("%s\n",arr[i]);
    }

}
void clear_arr(char* arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        free(arr[i]);
    }

}

但我的 number = 3 的输出是:

word
word
word
Pi╛
word
word

看起来只有数组的第一个“单元格”被释放,而其他“单元格”不受影响。我的clear_arr函数有什么问题吗? 如果重要的话我正在使用 VScode 进行编译...


那是因为你尝试打印你释放的东西。这free函数释放内存,但数组中仍然有地址。

你能做的是:

void clear_arr(char* arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        free(arr[i]);
        arr[i] = NULL;
    }

}

这样,打印函数就不会循环遍历已释放指针的数组。

有更好的方法来 malloc 和复制字符串,您可以使用该函数strdup.

您的代码可以这样优化:

int number = 10;
char **myarr = malloc((number+1)*sizeof(char*));
for (int i = 0; i < number; i++)
{
  myarr[i] = strdup("word");
}

myarr[number] = NULL;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 malloc 设置字符串数组然后清除它 的相关文章

随机推荐