Probleme mit Arrays



  • Hallo!

    Ich versuche gerade zwei Arrays auszugeben, aber irgendwie scheint das nicht so zu klappen. Der Wert vom zweiten Array wird irgendwie ans erste angehängt.... was mache ich da falsch?

    #include <stdlib.h>
    #include <stdio.h>
    
    int main(){
      char var1[2]={'A','B'};
      char kl[]="DAS IST EIN TEST\n";
    
      printf("Test1: %s\n",var1);
      printf("Test2: %s\n",kl);
    
      return(0);
    }
    

    Grüße

    Daniel



  • var1 ist kein String, da nicht nullterminiert. Demnach darfst du var1 nicht als String behandeln (aka mit printf() ausgeben).



  • Der Wert vom zweiten Array wird irgendwie ans erste angehängt.... was mache ich da falsch?

    Daraus erkennst du btw, dass dein Compiler die beiden gleich nacheinander im Speicher anordnet. Entzückend, oder?

    var1 ist kein String, da nicht nullterminiert.

    Daran liegt's. Also:

    char var1[]={'A','B','\0'};  // die Dimension kann der Compiler auch durch abzählen feststellen
    

    EDIT: Ein lohnendes Experiment wäre es, bei var1 das Nullbyte am Ende am wegzulassen, aber es NACH var2 zu definieren...



  • Das mit der Nullterminierung hab ich mir auch schon mal gedacht.... aber ist es mir dann generell nicht möglich ein "char var[2]" zu definieren, also eines mit ner fixen länge die ich angebe?

    Müsste da nicht von sich aus erkannt werden, wo die nullterminierung sein soll, da die länge ja bereits notwendig ist....



  • Müsste da nicht von sich aus erkannt werden, wo die nullterminierung sein soll, da die länge ja bereits notwendig ist....

    Nein.

    Die Länge wird auf GENAU zwei Weisen festgelegt, im Index bei der Definition, so wie du das gemacht hast, oder, wenn das unterlassen wurde, durch abzählen.

    Die Position des Nullbytes markiert ein anderes Ende, nämlich nicht das Ende des Speicherbereichs (das ist nämlich gar nicht markiert), sondern das Ende der sinnvollen Zeichenkette. Also kannst du zB sagen:

    char s[5]={'1', '2', '3', '\0', '4'};
    

    Dann hat der Speicherbereich von s die Länge 5 (das muss man sich merken, man kann's nie wieder herausfinden), s als String hat die Länge 3:

    strlen(s) // ergibt 3
    printf(s) // gibt aus: 123
    

    Alles klar?



  • ok, vielen danke, jetzt ists klar



  • cheopz schrieb:

    Dann hat der Speicherbereich von s die Länge 5 (das muss man sich merken, man kann's nie wieder herausfinden), s als String hat die Länge 3:

    Klar kannst du die Größe wieder herausfinden (zumindesst solange wie du dieses Array nicht auf einen Zeiger "reduziert" hast) - Stichwort 'sizeof()'.



  • danny1 schrieb:

    Das mit der Nullterminierung hab ich mir auch schon mal gedacht.... aber ist es mir dann generell nicht möglich ein "char var[2]" zu definieren, also eines mit ner fixen länge die ich angebe?

    Müsste da nicht von sich aus erkannt werden, wo die nullterminierung sein soll, da die länge ja bereits notwendig ist....

    merke, der Compiler weißt nicht, was du vorhast, er kann nicht wissen, dass dein char var[2] für ein Sring benutzt wird, also kann er nicht so Sachen annehmen, dass man ein '\0' am Ende des Speicherbereiches schreibt, weil ein char var[2] nicht unbedingt ein String speichern soll. Der Compiler weiß nur über die Syntax bescheid, nicht über die Semantik.



  • Klar kannst du die Größe wieder herausfinden (zumindesst solange wie du dieses Array nicht auf einen Zeiger "reduziert" hast) - Stichwort 'sizeof()'.

    Sehr richtig, hatte ich schon vergessen, weil zwischen den Funktionen immer die "Reduktion" stattfindet.


Anmelden zum Antworten