Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 27

Thema: Frage zu Segmentation fault (Unterschied zwischen Array und Zeiger)

  1. #1
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665

    Frage zu Segmentation fault (Unterschied zwischen Array und Zeiger)

    Folgendes Programm:
    Code:
    #include <stdio.h>
    
    int main()
    	{
    	char bla1[4]="bla";
    	printf("bla1...\n");
    	*bla1=0; //geht
    	
    	char *bla2="bla";
    	printf("bla2...\n");
    	*bla2=0; //geht nicht
    	}
    Dabei geht *bla1=0 ohne Probleme, aber *bla2=0 gibt ein Segmentation fault.

    Ich vermute, dass die Daten in bla2 irgendwie auf readonly gesetzt sind oder so...

    Aber warum wird zwischen bla1 und bla2 überhaupt ein Unterschied gemacht? Eigentlich sind Arrays und Zeiger intern doch das gleiche!?
    Wird davon ausgegangen, dass man einen so definierten String nie ändern will?

  2. #2
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Wundert mich sowieso, dass

    char a=0;

    einfach so geht; Mach doch zumindest ' ' drumherum...

    Und afaik werden doch Pointern die Werte mittels Adress-operator & zugewiesen...

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Ich vermute, dass die Daten in bla2 irgendwie auf readonly gesetzt sind oder so...
    Da sollte man nicht vermuten. In eine Stringliteral darf man nicht schreiben. Deshalb solltest du auch nicht <<char* p = "...";>> machen, sondern <<char const* p = "...";>>. Dann macht dich der Compiler auf den Fehler aufmerksam.

    Aber warum wird zwischen bla1 und bla2 überhaupt ein Unterschied gemacht? Eigentlich sind Arrays und Zeiger intern doch das gleiche!?
    Ein recht verbreiteter Irtum. Nein, Zeiger und Arrays sind nicht das gleiche. Aber deshalb stürzt dein Programm nicht ab. bla1 und bla2 unterscheiden sich in der Beziehung gar nicht, auch wenn du das glaubst. Beide sind Zeiger, und beide Zeigen auf ein Array. Der Unterschied ist bloß, das bla2 auf eine Array zeigt, welches du nicht verändern darfst.

    bischi:
    Bei <<char a=0;>> wird einfach eine integrale Konvertierung vorgenommen.

  4. #4
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von locus vivendi
    In eine Stringliteral darf man nicht schreiben. (...) beide Zeigen auf ein Array. Der Unterschied ist bloß, das bla2 auf eine Array zeigt, welches du nicht verändern darfst.
    Angenommen ich will etwas äquivalentes zu dem Stringliteral haben, was ich aber zur Laufzeit noch verändern kann - wie setzt man das dann üblicherweise um?
    Nimmt man dann ein Array statt einem Zeiger oder bleibt man lieber beim Zeiger und allokiert dann erst zur Laufzeit den Speicher und kopiert den Inhalt eines Stringliterals da rein? Oder gibt es noch andere Lösungen?

  5. #5
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Na das kommt drauf an was du benötigst. Wenn du die grösse (oder eine vernünftige Maximalgrösse) schon vorher kennst nimmst du ein Array.
    Sonst musst du halt wohl oder übel mit malloc drauf los...

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  6. #6
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Oder std::vector<char> verwenden. Kannst du beliebig viele Zeichen anhängen und entfernen.

    [edit]Geht natürlich nur in C++; Für C würd ich irgend eine Linked-List verwenden.[/edit]

    Zitat Zitat von locus vivendi
    bischi:
    Bei <<char a=0;>> wird einfach eine integrale Konvertierung vorgenommen.
    Klar - aber guter Programmierstil ist das nicht gerade...



    MfG Bischi
    Geändert von bischi (05-02-2006 um 11:12 Uhr)

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  7. #7
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Und wie wäre denn die "gute Stilvariante" von "char a = 0"? Ascii-Tabelle nachgucken was jetzt 0 schon wieder war? Naja, *das* ist dann auch gut leserlicher Code

    Und eine linked List für Chars ist ja wohl eher ein schlechter Witz - ich meine da benutzt du etwa 4 mal mehr Speicher für Pointer als für die Daten...

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  8. #8
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Ja, schade, dass man nicht mehr in Strings schreiben kann, wie noch vor 10 Jahren

    Denn dort konnte man so schöne sachen machen:
    Code:
    #include <stdio.h>
    int main()
    {
       "Sie nutzen C++"[12] = 0;
       printf("Sie nutzen C++");
    }
    Ein mit einem C-Compiler compilierte Code würde "Sie nutzen C" ausgeben, mit C++ compiliert "Sie nutzen C++"
    Was heute immer noch geht, ist
    Code:
    int main()
    {
       int a=4;
       int b[10];
    
       a[b] = 12;
    }

  9. #9
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    Zitat Zitat von Joghurt
    Was heute immer noch geht, ist
    Code:
    int main()
    {
       int a=4;
       int b[10];
    
       a[b] = 12;
    }
    eine variante davon ist auch
    Code:
      int a[2];
      a[0]=5;
      1[a]=6;
    diese dinge funktionieren wahrscheinlich wegen der assoziativität der (pointer) addition
    religion is a virus from outer space

  10. #10
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von bischi
    Oder std::vector<char> verwenden. Kannst du beliebig viele Zeichen anhängen und entfernen.
    Ums Anhängen ging es mir ja garnicht, sondern nur darum, einen vorbelegten Speicherbereich verändern zu können.

    Und wegen dem char a=0: In dem Beispiel aus dem ersten Post habe ich den String so verändert, dass er anschließend leer ist. Also war nicht '0', sondern wirklich 0 gemeint.

  11. #11
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von BLUESCREEN3D
    Ums Anhängen ging es mir ja garnicht, sondern nur darum, einen vorbelegten Speicherbereich verändern zu können.
    Dann schreib doch
    Code:
    char a[]="bla"

  12. #12
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Dazu hatte peschmae mir ja schon geraten

    (Von meiner Seite hat sich der Thread erledigt.)

  13. #13
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von BLUESCREEN3D
    Ums Anhängen ging es mir ja garnicht, sondern nur darum, einen vorbelegten Speicherbereich verändern zu können.
    Ja, aber wenn du anhängen und ändern kannst, kannst du beliebig grosse Texte später reinschreiben und editieren.

    Und wegen dem char a=0: In dem Beispiel aus dem ersten Post habe ich den String so verändert, dass er anschließend leer ist. Also war nicht '0', sondern wirklich 0 gemeint.
    Ich schreib da jeweils char a = null;

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  14. #14
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Und null ist was?

    Ich finde 0 eigentlich genug klar

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  15. #15
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    NULL ist nicht definiert :P ist weder 0 noch sonst irgendwas.
    somit wenn man NULL meint sollte man auch NULL schreiben

    greetz

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •