Ist es möglich, char umzuwandeln?[] in C char*?

Lesezeit: 5 Minuten

Ich mache eine Aufgabe, bei der wir eine Reihe von Zeichenfolgen aus einer Datei in ein Array einlesen müssen. Ich muss einen Verschlüsselungsalgorithmus für das Array aufrufen (Verschlüsselung transponiert 2D-Arrays). Also habe ich zuerst alle Informationen aus der Datei in ein 2D-Array eingefügt, aber ich hatte große Probleme mit widersprüchlichen Typen im Rest meines Codes (insbesondere beim Versuch, char[] zu char*). Also beschloss ich, zu einem Array von Zeigern zu wechseln, was den größten Teil meines Codes viel einfacher machte.

Aber jetzt muss ich char* in char umwandeln[] und wieder zurück, aber ich komme nicht drauf. Bei google habe ich nichts gefunden. Ich beginne mich zu fragen, ob es überhaupt möglich ist.

  • Lesen Sie Abschnitt 6 der comp.lang.c FAQ.

    – Keith Thompson

    9. März 2012 um 2:28 Uhr

Benutzeravatar von Timothy Jones
Timothy Jones

Es hört sich so an, als wären Sie zwischen Zeigern und Arrays verwechselt. Zeiger und Arrays (in diesem Fall char * und char []) sind nicht dasselbe.

  • Eine Anordnung char a[SIZE] sagt, dass der Wert an der Stelle von a ist ein Array der Länge SIZE
  • Ein Zeiger char *a; sagt, dass der Wert an der Stelle von a ist ein Zeiger auf a char. Dies kann mit Zeigerarithmetik kombiniert werden, um sich wie ein Array zu verhalten (z. B. a[10] ist 10 Einträge Vergangenheit wo auch immer a Punkte)

Im Speicher sieht es so aus (Beispiel aus die FAQ):

 char a[] = "hello";  // array

   +---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
   +---+---+---+---+---+---+

 char *p = "world"; // pointer

   +-----+     +---+---+---+---+---+---+
p: |  *======> | w | o | r | l | d |\0 |
   +-----+     +---+---+---+---+---+---+

Es ist leicht, den Unterschied zwischen Zeigern und Arrays zu verwechseln, da in vielen Fällen eine Array-Referenz in einen Zeiger auf ihr erstes Element “zerfällt”. Das bedeutet, dass Arrays in vielen Fällen (z. B. bei der Übergabe an einen Funktionsaufruf) zu Zeigern werden. Wenn Sie mehr wissen möchten, Dieser Abschnitt der C-FAQ beschreibt die Unterschiede im Detail.

Ein wesentlicher praktischer Unterschied besteht darin, dass der Compiler weiß, wie lang ein Array ist. Anhand der obigen Beispiele:

char a[] = "hello";  
char *p =  "world";  

sizeof(a); // 6 - one byte for each character in the string,
           // one for the '\0' terminator
sizeof(p); // whatever the size of the pointer is
           // probably 4 or 8 on most machines (depending on whether it's a 
           // 32 or 64 bit machine)

Ohne Ihren Code zu sehen, ist es schwierig, die beste Vorgehensweise zu empfehlen, aber ich vermute, dass die Umstellung auf die Verwendung von Zeigern überall die Probleme lösen wird, die Sie derzeit haben. Beachten Sie das jetzt:

  • Sie müssen den Speicher dort initialisieren, wo sich früher die Arrays befanden. Z.B, char a[10]; wird werden char *a = malloc(10 * sizeof(char));gefolgt von einer Überprüfung, dass a != NULL. Beachten Sie, dass Sie es eigentlich nicht sagen müssen sizeof(char) in diesem Fall, weil sizeof(char) ist als 1 definiert. Ich habe es der Vollständigkeit halber belassen.

  • Überall dort, wo Sie zuvor waren sizeof(a) für die Array-Länge muss durch die Länge des von Ihnen zugewiesenen Speichers ersetzt werden (wenn Sie Zeichenfolgen verwenden, könnten Sie verwenden strlen()was bis zum zählt '\0').

  • Sie müssen einen entsprechenden Anruf tätigen free() für jeden Anruf an malloc(). Dies teilt dem Computer mit, dass Sie mit der Verwendung des angeforderten Speichers fertig sind malloc(). Wenn Ihr Zeiger ist aeinfach schreiben free(a); an einer Stelle im Code, an der Sie wissen, dass Sie nichts mehr brauchen a verweist auf.

Wie eine andere Antwort darauf hingewiesen hat, können Sie Folgendes verwenden, wenn Sie die Adresse des Anfangs eines Arrays abrufen möchten:

char* p = &a[0] 

Sie können dies als “Zeichenzeiger lesen p wird zur Adresse des Elements [0] von a“.

  • Im letzten Beispiel kann nicht char *p = &a[0] zu gerecht vereinfacht werden char *p = &a ?

    – thom_nic

    25. Juni 2015 um 18:17 Uhr

  • @thom_nic: Nein, weil &a hat den Typ char (*)[6], dh ein Zeiger auf ein Array aus sechs Zeichen. Das ist nicht dasselbe wie char *, sodass Sie eine Warnung erhalten. Allerdings kann man sagen char *p = a;weil eine Array-Referenz dies kann zerfällt in einen Zeiger auf sein erstes Element. Ich habe hier die längere Form verwendet, weil sie besser veranschaulicht, was passiert.

    – Timothy Jones

    26. Juni 2015 um 1:04 Uhr


  • Ah, ich sehe, dass die Wörter, die ich in der vorletzten Zeile verwendet habe, verwirrend gewesen sein könnten. Ich habe die Antwort bearbeitet.

    – Timothy Jones

    26. Juni 2015 um 1:11 Uhr

  • Ich würde das auch hinzufügen, falls char *awenn a ist nicht initialisiert oder zeigt auf ein Zeichenfolgenliteral, wie z char *a = "hello"dann a[0] oder a[1] wäre ein gültiges Lesen, aber jeder Versuch, was zu schreiben a Punkte auf wären nicht gültig, was zu einem Segmentierungsfehler führen würde.

    – Alexander Strachov

    5. März 2019 um 0:27 Uhr


Wenn Sie haben
char[] c
dann kannst du das machen
char* d = &c[0]
und Zugriffselement c[1] durch tun *(d+1)etc.

  • Oder Sie können einfach char *d = c;.

    – mah

    9. März 2012 um 2:20 Uhr

Sie müssen sie nicht als Arrays deklarieren, wenn Sie sie als Zeiger verwenden möchten. Sie können einfach auf Zeiger verweisen, als wären sie mehrdimensionale Arrays. Erstellen Sie es einfach als Zeiger auf einen Zeiger und verwenden Sie es malloc:

int i;
int M=30, N=25;
int ** buf;
buf = (int**) malloc(M * sizeof(int*));
for(i=0;i<M;i++)
    buf[i] = (int*) malloc(N * sizeof(int));

und dann kannst du referenzieren buf[3][5] oder Wasauchimmer.

  • Gießen Sie nicht das Ergebnis von malloc().

    – Keith Thompson

    9. März 2012 um 2:26 Uhr

  • Es ist notwendig, weil malloc() gibt a zurück void *die in eine umgewandelt werden muss int * eingelagert werden buf.

    – jcai

    9. März 2012 um 2:37 Uhr

  • Nein, die Besetzung ist nicht notwendig. In C ein Ausdruck vom Typ void* kann implizit in einen beliebigen Zeiger-auf-Objekt-Typ (oder Zeiger-auf-Unvollständig-Typ) konvertiert werden. Siehe Frage 7.7b des comp.lang.c FAQ und Abschnitt 6.5.16.1 des C-Standard. (C++ hat andere Regeln, die relevant wären, wenn wir über C++ sprechen würden.)

    – Keith Thompson

    9. März 2012 um 2:40 Uhr


Benutzeravatar von TheHappyMarvin
TheHappyMarvin

Nun, ich bin mir nicht sicher, ob ich deine Frage verstehe…

In C, Zeichen[] und Char* sind dasselbe.

Edit: Danke für diesen interessanten Link.

1413690cookie-checkIst es möglich, char umzuwandeln?[] in C char*?

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

Privacy policy