Как «очистить» массив в c, чтобы освободить место для меньшего массива? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть массив в C, давайте предположим, что это

**arr = malloc(100 * sizeof(char*));

через какую-то функцию, я заполняю этот массив таким образом, чтобы он в итоге оказался

arr = {"first", "second", "third", "fourth", ... "tenth"};

Теперь, если я хочу заполнить его заново, чтобы оно было

arr = {"1st", "2nd", "3rd"}; //Desired outcome

вместо этого он отображается как

arr = {"1st", "2nd", "3rd", "fourth", "fifth", ... "tenth"}; //Actual outcome

Я уверен, что мой код неверен, и моя функция для его заполнения из пустого - это хорошо, но я просто хочу найти способ стереть его. Я попытался free (), но я использовал это неправильно, или это не то, что я должен использовать.

У кого-нибудь из вас есть функция, которая может не только установить строку на "\0", но и полностью уничтожить ее?


Всем, кто прокомментировал и ответил, спасибо.

Я использовал текстовые файлы, strtok и strdup для чтения слов из файла в двойной указатель char. Я не хочу, чтобы в массиве хранилось более 5000 слов, даже если мой файл содержит 5001+ слов.

Я сделал это. Я успешно заполнил память строками из файла. Но если бы я передумал и попытался заполнить память меньшим файлом (~ 30 слов), он изменил бы первые 30 и оставил бы 4970, как они были, когда я хотел, чтобы их не существовало.

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Вы можете использовать функцию realloc для изменения емкости вашей переменной arr: arr = realloc(arr, 3 * sizeof(char*)) - перераспределить память для 3 элементов.Затем вы должны назначить эти 3 элемента на ваш arr

0 голосов
/ 22 марта 2019

Использование функции realloc:

Синтаксис: void *realloc(void *ptr, size_t size);

Функция realloc () изменяет размер блока памяти, на который указывает ptr, на размер в байтах.Содержимое будет неизменным в диапазоне от начала региона до минимума старого и нового размеров.Если новый размер больше старого, добавленная память не будет инициализирована.Если ptr равен NULL, то вызов эквивалентен malloc (size) для всех значений размера;если размер равен нулю, а ptr не равен NULL, то вызов эквивалентен free (ptr).Если ptr не равен NULL, он должен быть возвращен более ранним вызовом malloc (), calloc () или real-loc ().Если область, на которую указывает указатель, была перемещена, выполняется освобождение (ptr)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char *arr = malloc(sizeof(strlen(arr)) + 1);
    strcpy(arr, "Hello World!");

    char *arr_new = realloc(arr, sizeof(strlen(arr_new)) + 1);
    strcpy(arr_new, "Hello!");

    if(arr != NULL) {
        free(arr);
    // Free whatever used

  }
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...