我想使用 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(使用前将#替换为@)