Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用malloc设置字符串数组,然后清除它_C_Arrays_Malloc - Fatal编程技术网

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

使用malloc设置字符串数组,然后清除它,c,arrays,malloc,C,Arrays,Malloc,我想使用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;

我想使用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]);
    }

}
看起来只有数组的第一个“单元”被释放,而另一个没有受到影响。我的clear_arr功能有什么问题?
我正在使用VScode进行编译,如果这很重要的话…

那是因为你试图打印你想要的东西。
free
函数取消分配内存,但数组中仍有地址

您可以做的是:

void clear\u arr(字符*arr[],整数大小)
{
对于(int i=0;i
这样,print函数就不会在一个自由指针数组中循环

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

您的代码可以通过以下方式进行优化:

int number=10;
字符**myarr=malloc((数字+1)*sizeof(字符*);
for(int i=0;i
我知道我正在尝试打印已释放的内容,但我想知道为什么只有第一个条目看起来已释放:打印乱码,其余条目打印字符串。当您尝试访问空闲内存时,行为未定义。也许你的数据仍然存在,也许另一个程序使用这个内存并在其中写入其他数据,任何事情都可能发生,因为它不是你的内存。
word
word
word
Pi╛
word
word