Как выделить или освободить только части массива? - PullRequest
2 голосов
/ 19 марта 2010

см. Этот пример:

 int *array = malloc (10 * sizeof(int)) 

Тогда освободите только первые 3 блока?

Или сделать равным java, иметь массив с отрицательным индексом или индекс, который не начинается с 0.

Большое спасибо.

Ответы [ 2 ]

17 голосов
/ 19 марта 2010

Вы не можете напрямую освободить первые 3 блока. Вы можете сделать нечто подобное, перераспределив массив поменьше:

/* Shift array entries to the left 3 spaces. Note the use of memmove
 * and not memcpy since the areas overlap.
 */
memmove(array, array + 3, 7);

/* Reallocate memory. realloc will "probably" just shrink the previously
 * allocated memory block, but it's allowed to allocate a new block of
 * memory and free the old one if it so desires.
 */
int *new_array = realloc(array, 7 * sizeof(int));

if (new_array == NULL) {
    perror("realloc");
    exit(1);
}

/* Now array has only 7 items. */
array = new_array;

Что касается второй части вашего вопроса, вы можете увеличить array, чтобы он указывал на середину блока памяти. Затем вы можете использовать отрицательные индексы:

array += 3;
int first_int = array[-3];

/* When finished remember to decrement and free. */
free(array - 3);

Та же идея работает и в обратном направлении. Вы можете вычесть из array, чтобы начальный индекс был больше 0. Но будьте осторожны: как указывает @David Thornley, это технически неверно в соответствии со стандартом ISO C и может работать не на всех платформах.

6 голосов
/ 19 марта 2010

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

Что касается отрицательных или ненулевых индексов, вы можете делать с указателем все, что захотите, когда вернете его из malloc(). Например:

int *array = malloc(10 * sizeof(int));
array -= 2;

Создает массив с допустимыми индексами 2-11. Для отрицательных показателей:

int *array = malloc(10 * sizeof(int));
array += 10;

Теперь вы можете получить доступ к этому массиву, например array[-1], array[-4] и т. Д.

Убедитесь, что не обращаетесь к памяти вне вашего массива. Этот тип забавного бизнеса обычно осуждается в программах на С и программистами на Си.

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