kann Realloc Array, dann Warum Zeiger verwenden?

Dies war ein Bewerbungsgespräch, dem ich gegenüberstand. Sie fragten, ob wir Array wieder zuweisen können, ich sagte ja. Dann fragten sie - warum brauchen wir Zeiger, da die meisten Menschen Grund dafür geben, dass sie Speicherplatz verschwenden. Ich konnte keine befriedigende Antwort geben. Wenn irgendeine Leiche eine befriedigende Antwort geben kann, bin ich verpflichtet. Bitte erwähnen Sie jede Situation, in der die obige Aussage widersprechen kann.

Vielen Dank.

2

4 Antworten

Sie können ein Array, das dynamisch zugewiesen wurde, nur neu zuordnen. Wenn es statisch zugewiesen wurde, kann es nicht [sicher] neu zugewiesen werden.

Zeiger halten Adressen von Daten im Speicher. Sie können dynamisch zugewiesen, freigegeben und neu zugewiesen werden, indem die neuen/delete-Operatoren in C ++ und malloc/free in C verwendet werden.

Ich würde Ihnen wärmstens empfehlen, Die C-Programmiersprache zu lesen Kernighan und Ritchie und ein solider C ++ - Text wie C ++ von Grund auf von Herbert Schildt.

Die Verwendung von dynamischem Speicher, Zeigern, Offsets usw. sind grundlegend für die Verwendung dieser zwei Sprachen. Nicht zu wissen, wie sie funktionieren, und warum sie existieren, wird ein möglicher Grund dafür sein, dass potenzielle Arbeitgeber Sie abweisen.

* Der Compiler sollte nicht Ihnen erlauben, alles neu zuzuordnen, das statisch zugewiesen wurde, aber wenn dies der Fall ist, ist das Verhalten nicht definiert

8
hinzugefügt
Ich habe seinen Annotated C Standard nicht gesehen - also kann ich nicht direkt kommentieren, aber ich habe das Ground Up Buch im Unterricht verwendet und fand heraus, dass die Schüler es wirklich verstehen, wenn sie diesen Text verwenden
hinzugefügt der Autor warren, Quelle
Ist Schildts C ++ besser als sein 'Annotated C Standard'?
hinzugefügt der Autor Jonathan Leffler, Quelle

Die Formulierung ist ein bisschen komisch, aber für mich scheint es, als wäre die Interviewfrage eine offene Frage, die dich dazu bringen soll zu erklären, was du über Arrays, Zeiger, dynamische Speicherzuweisung usw. weißt. Wenn ich der Interviewer wäre der Kandidat, um die Unterschiede zwischen int * a = malloc (10 * sizeof (int)); und int a [10]; zu artikulieren. Die Nachfolgefrage ist nicht sehr gut formuliert, aber es war wahrscheinlich ein Versuch, den Kandidaten in Richtung der Differenz zwischen einem Zeiger und einem Array zu stupsen und den Gedankengang aufzubrechen.

5
hinzugefügt

OK. Sie können ein Array, das statisch deklariert wurde, nicht neu zuordnen. Der Zweck der Verwendung von Zeigern (anstelle von statisch deklariertem Array) wäre, dass Sie den Speicherplatz neu zuweisen können. Ich denke, um technisch korrekt zu sein, könnten Sie ein statisch definiertes Array neu zuweisen, indem Sie einen Zeiger darauf übergeben, aber das möchte ich nicht. Das Verhalten ist nicht definiert, wenn sich der Zeiger auf Speicher befindet, der nicht von malloc zugewiesen wurde.

2
hinzugefügt
Mit der Realloc-Funktion können wir die Größe eines zuvor zugewiesenen Bereichs erhöhen oder verringern (am häufigsten wird ein Bereich vergrößert). Wenn wir beispielsweise Platz für 512 Elemente in einem Array reservieren, das wir zur Laufzeit ausfüllen, finden wir das wir brauchen Platz für mehr als 512 Elemente, wir können Realloc nennen.
hinzugefügt der Autor iankits, Quelle
linux.die.net/man/3/realloc - wird immer noch nicht mit helfen statisch zugewiesene Gegenstände
hinzugefügt der Autor warren, Quelle

Ich verstehe nicht wirklich, wie die Verwendung von Zeigern "Speicher verschwendet". Die Realloc-Funktion: -

void *realloc(void *ptr, size_t size);

nimmt einen Zeiger auf den Speicher, um die Größe als Parameter zu ändern. Außerdem gibt es viel mehr Verwendungen für Zeiger als dynamischer Speicher, z. B. durch Referenz.

1
hinzugefügt
"Speicherverschwendung" könnte bedeuten, dass int * ra = malloc (10 * sizeof (int)); führt zur Verwendung von mehr Speicher als int ra [10]; aufgrund des Overheads Ihrer malloc-Implementierung. Es gibt jedoch bessere Gründe, Arrays auf dem Stack zu verwenden.
hinzugefügt der Autor Steve Jessop, Quelle
Oh, und wenn das Array zu etwas gehört, das durch eine Struktur repräsentiert wird, gibt es den offensichtlichen "Verschwendung" -Wert, dass das Speichern eines Zeigers auf das Array, anstatt nur das Array in die Struktur einzubetten und nach Mitgliedsnamen zugreift, eine zusätzliche Größe von (void *) Bytes.
hinzugefügt der Autor Steve Jessop, Quelle