Jeśli chcesz usuwać z końca to możesz po prostu wykorzystywać tylko część tablicy. Jeśli zależy Ci na fizycznym zmniejszeniu takiej tablicy lub usunięciu czegoś ze środka to musisz zaalokować nową mniejszą i przepisać do niej elementy, które mają zostać. Można to zrobić w ten sposób:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n = 10;
int* tab = malloc(sizeof(int) * n);
for (size_t i = 0; i < n; i++)
{
tab[i] = i;
}
n /= 2;
int *smaller_tab = malloc(sizeof(int)*n);
memcpy(smaller_tab, tab, n *sizeof(int));
free(tab);
for (size_t i = 0; i < n; i++)
{
printf("%d ", smaller_tab[i]);
}
}