Hi,
Folgender Code soll das ganze erreichen:
#include <stdio.h>
#include <stdlib.h>int func(int *list, size_t size) {
list ist hier die Startadresse des alten Feldes.
int ret = list[0];
int *newlist = malloc((size - 1) * sizeof(int));
newlist ist die Startadresse des neuen Feldes.
int i;
for(i = 1; i < size; i++)
newlist[i-1] = list[i];
Hier kopierst du die Werte aus der alten liste in die neue.
list = newlist;
Jetzt überschreibst du den Inhalt von list mit der neuen Adresse. Das heißt aber nicht, dass sich auch in main die Startadresse von list ändert.
return ret;
}
Am einfachsten wäre es, auf newlist komplett zu verzichten und die Werte aus list zu verschieben. Also so in der for-schleife:
list[i-1] = list[i];
Der Nachteil an dieser Lösung ist, dass das Feld immer gleich groß bleiben würde.
Die Lösung für dieses Problem wäre, list als Zeiger auf Zeiger zu übergeben, dann kannst du die Startadresse von list aus main ändern.
Dein Prototyp müsste dann so aussehen:
int func(int **list, size_t size)
Der aufruf wäre dann:
func(&list, argc-1);
Damit übergibst du die Adresse der Variablen, in der die Startadresse des Feldes steht und kannst die Startadresse dadurch ändern.
Dann müsstest du aber auch noch in der Funktion ein free für die alte Liste machen, weil du sonst immer mehr Speicher reservierst, der nicht mehr freigegeben wird.
mfG,
steckl