Nicht angemeldet. · Kennwort vergessen · Registrieren

misc
Mitglied seit 07/2011
13 Beiträge
Betreff: kurze frage zu arrays
hi!
ich hab nur ne kurze Frage:
was ist der Unterschied zwischen
char * a = "hallo";
und
char a[] = "hallo";
? ich dachte es gäbe keinen Unterschied, aber nur bei der zweiten Variante kann ich danach zb a[0] = 'b'; ausführen ohne einen Speicherzugriffsfehler zu bekommen. Danke,
Michael
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
...also bei mir verhalten die sich gleich:
  1. #include <stdio.h>
  2.  
  3. int main (int argc,char *argv []){
  4.     char * a = "hallo";
  5.     char b[] = "hallo";
  6.     printf("a: \"%s\"\nb: \"%s\" \na[0]: %c\nb[0]: %c\n", a, b, a[0], b[0]);
  7. }
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
...wer lesen kann ist klar im Vorteil! Nein es macht natürliche einen Unterschid:
char * a ist ein Pointer auf den konstanten String "hallo", während char a[] ein char-Array der Länge 6 ist, in den der konstante String "hallo" geladen wird. Der Compiler füllt die Klammer automatisch aus. Eigentlich steht da ja:
char a[6] = "hallo";.

P.s.: Man kann auch
char a[100] = "hallo";
schreiben. Dann kann man danach
strcpy(a, "Dieser String hat mehr als 6 Zeichen");
machen ohne das man über den reservierten Speicher schreibt.
Dieser Beitrag wurde am 01.08.2011, 10:40 von morty verändert.
Raim
GSPiC-Guru
Mitglied seit 05/2011
79 Beiträge
Antwort auf Beitrag #1
Der Unterschied liegt darin, wo der String im Speicher liegt und welche Zugriffe dort erlaubt sind. Dein Beispiel versucht den String zu verändern, was nicht überall erlaubt ist.

char *a = "hallo";

Diese Anweisung reserviert Platz für einen Pointer auf dem Stack und zeigt auf den String. Der String selbst landet aber im Textsegment und ist dort unveränderbar. Eine Zuweisung wie in deinem Beispiel ist daher nicht möglich, wohl aber der lesende Zugriff auf a[i].

char a[] = "hallo";

Diese Anweisung reserviert Platz für ein Array auf dem Stack, in dem der String abgelegt wird. Sowohl lesende als auch schreibende Zugriffe mit a[i] sind möglich.
misc
Mitglied seit 07/2011
13 Beiträge
dann verwende ich also am besten immer char a[] = "bla" (oder char a[100] = "bla"), dann bin ich auf der sicheren seite und kann alles damit machen?
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Das kommt darauf an was du machen willst. ;) Je nach Mikrocontroller verbraucht char * weniger Speicher, weil die Daten im Flash liegen bleiben können und nicht kopiert werden müssen. Auf einem normalen PC macht es effektiv wenig unterschied... ;) Den Unterschied solltest du trotzdem kennen...
misc
Mitglied seit 07/2011
13 Beiträge
Zitat von morty:
Den Unterschied solltest du trotzdem kennen...
mehr oder weniger ;) danke!
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen