Alcune osservazioni:
- il problema non è che non funziona, ma che non compila, in quanto stai cercando di assegnare un puntatore ad una variabile intera:
- Codice:
*lista = (int*) realloc(lista, (size - 1) * sizeof(int));
- il secondo for nella funzione eliminaElemento() è sbagliato e andrebbe corretto, per esempio, nel seguente modo:
- Codice:
for(int i = posizione + 1; i < size; i++)
listaProvvisoria[i - 1] = lista[i];
- inoltre, dal momento che dalla documentazione della realloc() si legge
The function may move the memory block to a new location (whose address is returned by the function).
è sbagliato passare il parametro
lista per copia;
- la funzione eliminaElemento() dovrebbe occuparsi anche di aggiornare il valore di
size;
- sarebbe buona norma liberare la memoria allocata in precedenza;
-
listaProvvisoria è superfluo, basta spostare gli elementi a partire da
posizione;
- chiamare un array dinamico
lista mi sembra un po' ambiguo.
Sulla base di quanto appena detto il codice diventa:
- Codice:
#include <stdlib.h>
#include <stdio.h>
void elimina_elemento(int **v, int *size, int posizione)
{
for(int i = posizione + 1; i < *size; ++i)
{
(*v)[i - 1] = (*v)[i];
}
*v = (int*)realloc(*v, --(*size) * sizeof(int));
}
void stampa_array(int *v, int size)
{
for(int i = 0; i < size; ++i)
{
printf("%d ", v[i]);
}
printf("\n");
}
int main()
{
int size = 5;
int *v = (int *)malloc(size * sizeof(int));
stampa_array(v, size);
elimina_elemento(&v, &size, 2);
stampa_array(v, size);
free(v);
}
Inoltre, a meno che tu non sia obbligato a farlo per esigenze particolari, non ha molto senso riallocare la memoria ogni volta, basta associare all'array dinamico una dimensione massima e una dimensione utilizzata.
EDIT:
Preceduto
Chi dorme in democrazia, si sveglia in dittatura.