Wie schon gesagt, meines Erachtens ist die Aufgabe an sich schon Kappes. Sie will vermitteln, daß man in C eben kein Array als Returnwert zurückliefern *kann* und verlangt dann genau das. Das *muß* bei Anfängern schief gehen.
Wissenslücke hat geschrieben:
Daß Du da einen Zeiger auf int zurückgibst, ist streng genommen verkehrt. Du sollst ein Array zurückgeben (aber das geht ja nicht). Das muß meiner Ansicht nach bei Anfängern zu heilloser Verwirrung führen.
Warum übergibst Du Length als Zeiger auf ein int? Die Aufgabenstellung verlangt eigentlich int.
Hier erzeugst Du ein Array auf dem Stack (lokale Variable) und initialisierst es leer. Gleich anschließend überschreibst Du den Zeiger (merke: Arrays werden zwar über einen Zeiger auf ihr erstes Element angesprochen, Arrays und Zeiger sind aber nicht dasselbe) mit einem, den Du von
malloc() zurückbekommen hast. Der Compiler wird das unnötige erste Array zwar wahrscheinlich wegoptimieren (schließlich kannst Du ja nicht mehr darauf zugreifen, weil Du den Zeiger überschrieben hast), schön ist das aber trotzdem nicht.
Dein
malloc()-Aufruf reserviert nur Speicher für ein int, Du brauchst aber zwei!
Nebenbei fehlt hier was: wer
malloc() aufruft, muß
immer auch den Returnwert auf
NULL prüfen (schließlich kann es immer sein, daß kein Heapspeicher mehr verfügbar ist, wenn Du dann einfach weitermachst, kracht's!
Code: Alles auswählen
int *newa = malloc(sizeof(int) * 2);
if (newa != NULL) {
....
}
else
return NULL;
Natürlich muß der Aufrufer das wissen und im Fall der Fälle mit der
NULL zurechtkommen, sonst kracht's auch.
Wissenslücke hat geschrieben:
Hier sieht man, daß den Aufgabenstellern offensichtlich gelungen ist, was sie bezwecken wollten: Du bist verwirrt

.
numbers ist ein Array aus
int, wie kriegt man da das 0-te und das "
Length"-te Element?
Die nächste Zeile ist leider auch verkehrt. Du willst einen Zeiger zurückgeben (
newa ist schon einer), gibst aber stattdessen die Adresse dieses Zeigers zurück (was effektiv einen Zeiger auf einen Zeiger darstellt). Das ist an sich schon falsch, hier aber doppelt:
newa ist eine lokale Variable, die beim Verlassen der Funktion nicht mehr gültig ist. Die Adresse davon dann natürlich erst recht nicht.
Wissenslücke hat geschrieben:
Jetzt mußt Du meine korrigierten Codefitzel nur noch richtig zusammenbauen und hast eine Lösung im Sinne der Aufgabensteller (wie gesagt, ich bin der Ansicht, daß die Aufgabe schon Quatsch ist).
Tip: schalte bei deinem Compiler alle Warnungen ein, lies' und versteh' sie. Dann beseitigst Du eine nach der anderen. Compiler kennen die C-Syntax besser als die meisten Programmierer, jedenfalls besser als ein Anfänger. Insbesondere der sollte darauf hören!
Ich hätte die Aufgabe übrigens ganz frech (und meiner Ansicht nach richtiger, aber wahrscheinlich im Sinne der Aufgabensteller falsch) kurz und bündig so beantwortet:
Code: Alles auswählen
struct areturn
{
int arr[2];
};
struct areturn boundary(int arr[], int length)
{
struct areturn ret = { arr[0], arr[length - 1] };
return ret;
}
Das gibt zwar nicht direkt ein Array zurück, aber ein solches in eine
struct verpackt (der Aufrufer muß es nur noch auspacken). Das ist in C erlaubt, die meisten Leute nutzen es aber nicht, weil es ineffektiv ist, große Strukturen über den Stack zurückzugeben. Hier finde ich es nicht verkehrt, zwei
int's über den Stack müssen immer gehen. Die Lösung erspart den Umgang mit Heap-Speicher und die dafür notwendige Fehlerbehandlung.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.