Array von Integer-Zeigern in C initialisieren

Lesezeit: 6 Minuten

Benutzeravatar von shably
schüchtern

Ich habe einige Verwirrung/Probleme mit der Verwendung von Zeigern in C. Ich habe den Beispielcode unten eingefügt, um ihn leicht zu verstehen. Bitte beachten Sie die Unterschiede dieser Codes. Wenn Sie Probleme haben, es zu verstehen, geben Sie bitte ein Feedback.

Das funktioniert nicht.

#include <stdio.h>
#include <stdlib.h>

void process() {
    int *arr;
    arr=(int*)malloc(5*sizeof(int));
    arr=(int*){3,1,4,5,2};
    for(int z=0;z<5;z++) {
        printf("%d ",arr[z]);
    }
    printf("\n");
}

int main() {
    process();
    return 0;
}

Aber das funktioniert.

#include <stdio.h>
#include <stdlib.h>

void process() {
    int *arr;
    arr=(int*)malloc(5*sizeof(int));
    arr=(int[]){3,1,4,5,2};
    for(int z=0;z<5;z++) {
        printf("%d ",arr[z]);
    }
    printf("\n");
}

int main() {
    process();
    return 0;
}

Auch das funktioniert. Wieso den? Ich habe hier keinen Speicher zugewiesen.

#include <stdio.h>
#include <stdlib.h>

void process() {
    int *arr;
    arr=(int[]){3,1,4,5,2};
    for(int z=0;z<5;z++) {
        printf("%d ",arr[z]);
    }
    printf("\n");
}

int main() {
    process();
    return 0;
}

Warum sind sie nicht gleich?

    arr=(int*){3,1,4,5,2};
    arr=(int[]){3,1,4,5,2};

Gibt es eine andere Möglichkeit, ein Array von Integer-Zeigern zu initialisieren, ohne diese individuelle Zuweisungsmethode zu verwenden?

arr[0]=3;
arr[1]=1;
arr[2]=4;
arr[3]=5;
arr[4]=2;

Wie kann ich die Größe / Anzahl der Zuordnungen im Speicher des Zeigers abrufen, damit ich so etwas verwenden kann? for(int z=0;z<NUM;z++) { Anstatt von for(int z=0;z<5;z++) { statisch?

Jede Antwort wird sehr geschätzt.

Danke im Voraus.

  • Benutzt du gcc? arr=(int[]){3,1,4,5,2}; Ich denke, es ist kein gültiges C++.

    – Jess Gut

    16. Mai 2012 um 23:59 Uhr

  • Ja, ich verwende den gcc-Compiler. Ist es kein gültiges C++? arr=(int[]){3,1,4,5,2};

    – schüchtern

    17. Mai 2012 um 0:02 Uhr

  • Ja, sie werden gerufen zusammengesetzte Literale und gcc akzeptiert sie in C++ als Erweiterung (versuchen Sie, mit -pedantic und Sie sollten eine Warnung erhalten).

    – Jess Gut

    17. Mai 2012 um 0:09 Uhr


  • Sie haben dort stdlib.h UND iostream. Auch Namensraum UND malloc. Welche Sprache ist das ? C+ ?

    – Scharlachroter Amaranth

    17. Mai 2012 um 0:11 Uhr

  • @ScarletAmaranth, ich habe iostream und Namespace entfernt. Es ist C. Danke.

    – schüchtern

    17. Mai 2012 um 0:16 Uhr

Benutzeravatar von Ernest Friedman-Hill
Ernest Friedman Hill

Das malloc Aufrufe in den ersten Beispielen weisen einen Speicherblock zu und weisen diesem Speicher einen Zeiger zu arr. Sobald Sie zuordnen arr Auch hier wird der Zeigerwert überschrieben, und Sie haben den Überblick über den zugewiesenen Speicher verloren – dh Sie haben ihn verloren. Das ist genau dort ein Fehler.

Mit anderen Worten, wenn Sie einen Speicherblock mit using zuweisen malloc()dann können Sie Daten mit Array-Syntax hineinschreiben (zum Beispiel):

int* arr = (int *) malloc(sizeof(int) * 5);
for (int i=0; i<5; ++i)
    arr[i] = i;

Aber Sie können nichts anderes direkt zuweisen arr, oder Sie verlieren den Zeiger auf diesen Speicherblock. Und wenn Sie einen Block mit zuweisen malloc()vergessen Sie nicht, es mit zu löschen free() wenn du es nicht mehr brauchst.

Ein Array ist nicht ein Zeiger auf eine ganze Zahl; es ist ein Array. Es wird gesagt, dass ein Array-Name “in einen Zeiger zerfällt”, wenn Sie ihn als Argument an eine Funktion übergeben, die einen Zeiger als Argument akzeptiert, aber sie sind nicht dasselbe.

Zu Ihrer letzten Frage: Das ist eigentlich der Unterschied zwischen einem Array und einem Pointer-to-Type: Der Compiler kennt die Größe eines Arrays, aber er kennt nicht die Größe eines Blocks, auf den ein beliebiger Pointer-to-Type zeigt. Die Antwort lautet leider nein.

Aber da Sie C++ und nicht C schreiben, sollten Sie sowieso keine Arrays verwenden: verwenden Sie `std::vector’! Sie kennen ihre eigene Länge und sind erweiterbar.

  • Den Vektor von STL zu verstehen, ist für den Anfänger zu schwierig.

    – Stepan Jakowenko

    17. Mai 2012 um 0:24 Uhr

  • @Ernest Friedman-Hill, ich habe nicht verstanden, hat der Code einen Fehler, den ich gepostet habe? Welcher hat den Fehler?

    – schüchtern

    17. Mai 2012 um 0:41 Uhr

  • @ user643540 — Ich hoffe, du machst Witze. Es ist einfacher, als von einem Baumstamm zu fallen.

    – Ernest Friedman Hill

    17. Mai 2012 um 0:59 Uhr

  • @prime — Die beiden, die enthalten malloc Verwenden Sie es falsch, und als Ergebnis verlieren Sie Speicher, was ein Fehler ist.

    – Ernest Friedman Hill

    17. Mai 2012 um 1:00 Uhr

  • @ErnestFriedman-Hill, sagst du mir, ich soll malloc nicht verwenden? Oder wie soll ich malloc verwenden und dann Werte zuweisen?

    – schüchtern

    17. Mai 2012 um 1:03 Uhr

Benutzeravatar von Stepan Yakovenko
Stepan Jakowenko

Wenn du sagst: ptr = {1,2,3,4,5}du machst ptr zeigen auf einen Speicher im Datensegment, wo konstantes Array {1,2,3,4,5} befindet sich und somit verlieren Sie Speicher. Wenn Sie Ihren Speicher gleich nach der Zuweisung initialisieren möchten, schreiben Sie: ptr[0]=1; ptr[1]=2; usw. Wenn Sie Daten kopieren möchten, verwenden Sie memcpy.

  • Ich möchte den Wert nicht individuell zuweisen, wie ich dort sagte.

    – schüchtern

    17. Mai 2012 um 0:04 Uhr

  • Wie möchten Sie den zugewiesenen Speicher füllen? Vielleicht möchten Sie nur Daten aus Ihrem konstanten Array lesen? Dann sagen Sie einfach: ptr = {1,2,3,4,5} ohne alloc() oder new[]. Aber Sie hätten keine Chance, dieses Array zu ändern.

    – Stepan Jakowenko

    17. Mai 2012 um 0:18 Uhr

  • Ihre Antwort ist etwas verwirrend. Was ist ptr hier Array oder Zeiger? Können Sie bitte den vollständigen C-Code mit ptr posten?

    – schüchtern

    17. Mai 2012 um 0:20 Uhr

  • Zeiger und Array sind in C gleich. Wenn Sie möchten, können Sie mich per Skype kontaktieren (stiv.yakovenko). Ich werde versuchen, es anhand eines Diagramms in mspaint zu erklären.

    – Stepan Jakowenko

    17. Mai 2012 um 0:22 Uhr

  • @stiv Es tut mir leid, Ihnen zu widersprechen, aber Arrays und Zeiger sind zwei sehr unterschiedliche Dinge in C. Versuchen Sie einfach Folgendes, wenn Sie mir nicht glauben: int a[3]; printf("sizeof(a) = %d\n", (int)sizeof(a)); printf("sizeof(a + 0) = %d\n", (int)sizeof(a + 0)); Der Erste printf() druckt 12, die zweite 8. Warum? Weil in a + 0 der Array-Bezeichner zerfiel in einen Zeiger, und das ist etwas ganz anderes als ein Array.

    – Cmaster – Wiedereinsetzung von Monica

    6. Januar 2014 um 13:03 Uhr

Die kommaseparierte Werteliste ist ein Konstrukt zum Initialisieren von Arrays. Es ist nicht zum Initialisieren von Zeigern auf Arrays geeignet. Deshalb brauchst du das (int[]) – Es weist gcc an, ein unbenanntes Array von Ganzzahlen zu erstellen, das mit den bereitgestellten Werten initialisiert wird.

gcc verhindert, dass Sie die Informationen verlieren arr ist ein Array, es sei denn, Sie möchten es wirklich. Deshalb braucht man eine Besetzung. Es ist besser, dass Sie erklären arr als Array, nicht als Zeiger. Sie können es immer noch an die Funktionen übergeben, die einen Zeiger akzeptieren. Dennoch würde gcc Sie mit malloc nicht zulassen, dass Sie Speicher verlieren:

error: incompatible types when assigning to type ‘int[5]’ from type ‘void *’

Wenn Sie eine Variable wollen, die entweder ein Array oder ein Zeiger auf zugewiesenen Speicher sein kann, erstellen Sie dafür eine andere Variable. Besser noch, erstellen Sie eine Funktion, die einen Zeiger akzeptiert und entweder ein Array oder einen Zeiger übergibt.

1432580cookie-checkArray von Integer-Zeigern in C initialisieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy