Как распределить или освободить только части массива?

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

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

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

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

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

Вы не можете напрямую освобождать первые 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 и может не работать на всех платформах.

Вы не можете освободить часть массива – вы можете только 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] и т. Д.

Не забудьте получить доступ к памяти вне вашего массива. Подобный забавный бизнес, как правило, нахмурился в программах на C и программистах C.