我想使用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("%sn",arr[i]);
}
}
void clear_arr(char* arr[], int size)
{
for (int i = 0; i < size; i++)
{
free(arr[i]);
}
}
但我对数字=3的输出是:
word
word
word
Pi╛
word
word
看起来只有数组的第一个"单元"是空闲的,而另一个没有受到影响。我的cleararr函数出了什么问题?如果这很重要的话,我正在使用VScode进行编译。。。
这是因为你试图打印一些你免费的东西。free
函数解除分配内存,但数组中仍有地址。
你能做的是:
void clear_arr(char* arr[], int size)
{
for (int i = 0; i < size; i++)
{
free(arr[i]);
arr[i] = NULL;
}
}
这样一来,print函数就不会在一个空闲指针数组中循环。
有一种更好的方法可以对字符串进行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;