используйте mallo c, чтобы установить массив строк, затем очистите его - PullRequest
4 голосов
/ 01 марта 2020

Я хочу создать массив строк, используя mallo c, а затем очистить ВСЕ выделенную память, я считаю, что я правильно использую mallo c, но я не могу понять, что я делаю неправильно, когда я пытаюсь чтобы очистить его:

#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]);
    }

}

но мой вывод для числа = 3:

word
word
word
Pi╛
word
word

похоже, что только первая "ячейка" массива освобождается, а другая не влияет что не так с моей функцией clear_arr? Я использую VScode для компиляции, если это имеет значение ...

1 Ответ

1 голос
/ 01 марта 2020

Это потому, что вы пытаетесь напечатать что-то, что вы бесплатно. Функция free освобождает память, но у вас все еще есть адрес в массиве.

Что вы можете сделать:

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

}

Таким образом, функция печати не будет * oop через массив free'd указателей.

Существует лучший способ для mallo c и копирования строки, вы можете использовать функцию 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;
...