eliminar la última fila y las últimas columnas de una matriz dinámica en c

He creado una matriz dinámica 2d en C declarada como una matriz de punteros. ¿Cómo elimino la última fila tanto en la matriz de punteros como en la fila a la que apunta?

si voy a usar el

arr=realloc(arr , i*sizeof(int *)); 

y el i es 3 (4 filas-1)

¿Las columnas en la cuarta fila se eliminarán o necesito usar algo como esto?

  arr[i]=realloc(arr[i] ,sizeof(char)); arr=realloc(arr , i*sizeof(int *)); 

Si es correcto o necesito usar free ()


Aquí está mi código, pero quiero eliminar la última fila con las columnas y no sé cómo

 int main(void) { char **arr,str[500]; int i=0,j,min_str_pos; long min; arr = malloc(sizeof(int *)); arr[i] = malloc(500*sizeof(char)); do { printf("Enter a string (or just press  to exit): \n"); fgets ( str, 500, stdin ); if (strcmp(str, "\n")) { strcpy(arr[i],str); i++; arr=realloc(arr , (i+1)*sizeof(int *)); arr[i] = malloc(500*sizeof(char)); } } while (strcmp(str, "\n")); 

Primero que todo, arreglé tu código para que al menos comstackra:

 int main(void) { char **arr,str[500]; int i = 0; arr = malloc(sizeof(int *)); arr[i] = malloc(500*sizeof(char)); do { printf("Enter a string (or just press  to exit)"); fgets (str, 500, stdin ); if (strcmp(str, "\n")) { strcpy(arr[i], str); i++; arr=realloc(arr , (i+1)*sizeof(int *)); arr[i] = malloc(500*sizeof(char)); } } while (strcmp(str, "\n")); } 

Tenga en cuenta que arr[i]=str; no es la forma correcta de copiar una cadena. En su lugar, use strcpy(arr[i], str); .

Para eliminar la última fila de la matriz, simplemente use:

 free(arr[i]); 

Ahora, al eliminar la última columna de la matriz, ¿quiere decir que desea eliminar la última char de cada string en la matriz?