Verstaendniss zu einem Codeausschnitt

  • Themenstarter Themenstarter sw33tlull4by
  • Beginndatum Beginndatum
S

sw33tlull4by

Guest
Hi!
Die Sprache ist C.
Ich progge etwas und der Einfachheit halber benutze ich einen Pointer fuer eine Eingabe von Stdin da ich nicht ganz genau weiss wie lang die Eingabe wird.
So.
Anschliessend habe ich das wie folgtin scanf gepackt
....
char*wasauchimmer;
printf("tzzzz");
scanf("%s",wasauchimmer);
......
Es kompelierte weiles ja syntaktisch richtig war.
aber hinter dem scanf() beendete das Programm immer abrupt.
Nach einigem hin und her habe ich scanf() wie folgt veraendert:
....
scanf("%d",&wasauchimmer);
...
So das stellt nun alles auf den Kopf was ich bis dahin meinte ueber Ponter zu wissen.
Denn bis dahin dachte ich immer * dereferenziert, es sei denn er wird gerade deklariert und & liefert einen Pointer zu einer "normalen" Variablen zurueck.
Demzufolge muesste das ja ein Pointer zu einem Pointer sein, was bedeutet das es sich um einen Array von Strings handelt was nicht der Fall ist.
bzw, wenn scanf() das dann so nimmt muesste strenggenommen die Adresse in wasauchimmer ueberschrieben werden.
Was mich aber vollendes aus dem Haeuschen bringt ist die Tatsache das folgende Zeile funktioniert und die Eingabe wiedergibt:
....
printf("%s",&wasauchimmer);
...
Kann bitte jemand mein Weltbild wieder ins Lot ruecken??
mfg

sw33t
 
Haette es nicht auch einfach getan zu sagen das mittels scanf("%s",&wasauchimmer);
ein Pointer einem Pointer zugewiesen wird und somit der wert von &wasauchimmer ueber wasauchimmer an *wasauchimmer uebertragen wird?
Und das ich Doespaddel die Initalisierung vergessen habe und die Zeiger somit irgendwo hinzeigen?
Das bedeutet dann aber auch fuer mein Programm das die Variante mit Pointern keinen vorteil bietet, denn wenn ich sie Initialisiert habe muss ich dazwischen ja noch einen Buffer anlegen damit sich die Inhalte nicht ueberschreiben.
also:
char h;
char buffer[200];
char*pointer = &h;
Das wiederum bedeutet aber das diese Methode unsicherer ist als einen normalen Array zu nehmen denn da kann man mittels sscanf() darauf achten das soetwas nicht geschieht.

Aber die Seite ist gut=>Bookmark^^
Mir ist naehmlich ein Partitiontabel abhanden gekommen und ich konnte meine HDD nur noch teilweilse wiederherstellen und meine ganzen tuts sind weg, darf also wieder anfangen zu sammeln.^^

Aber wo wir gerade wieder dabei sind:
Ich habe keinen Bock wegen einer unbestimmten Eingabelaenge(o.k. ich kann sie sehr gut abschaetzen aber jetzt mal rein theoretisch) eine Linked list anzulegen welche nur einen char oder int oder so enthaelt.
Bietet C/C++ da noch moeglichkeiten an wie das auch anders geht?
mfg

sw33t
 
Guck dir mal malloc(), realloc() und free() an. Damit kannst du dynamisch Speicher verwalten, das dürfte das sein was du suchst.
 
Vielen dank.
Also gehe ich richtig in der Annahme das es sogesehen keinen(einfachen) Weg gibt?
Denn ich implemetiere eine Linked List immer mit malloc() da das einen Pointer auf den
gerade alloziierten Speicher zurueckgibt und dann kann man damit bequem draufzugreifen.
Also ist bei mir Linked List und der Gebrauch von malloc() in diesem Fall fast identisch.
Wuerde wenn ich es ohne Linked List mache auch wieder darauf hinauslaufen das es eine professionellere Variante von einem Puffer waere dan erstelle ich einfach keinen array mehr und lasse dann einen Pointer darauf zeigen sondern alloziiere einen Speicherbereich(z.b.char*wasauchimmer = calloc(100,sizeof(char)) und lasse den ungebrauchten dann schrumpfen(mttels realloc(einziger , aber immenser Vorteil gegenueber der Arrayvariante)).
Wie dem auch sei.
Thx 4 support :)
mfg

sw33t
 
Ja so wie ich das sehe, hast du es gut verstanden ;)

PS: Schön, dass du es selbst nachgelesen hast und gleich so gut verstanden hast.
 
hmm
das habe ich dir eben in einer PM geschrieben.
Zu meiner schande muss ich das nun dank deinem Post oeffentlich richtigstellen. :rolleyes:
Ich kenne das alles.
Habe es schon irgendwo mal gehoert, aber ich vergesse schnell und ich bekomme die verknuepfung nicht immer in meinem Hirn hin,d.h. kann ich nciht immer Problemlos weiterarbeiten und das ist leider etwas was duch kein posten der Welt wegzumachen ist.*sign*
wie dem auch sei.
schoen zu sehen das du mein geplappere nicht krumm nimmst.
mfg

sw33t

P.s.:Deswegen auch der wink mit meinen Fehlenden REferencen/tutorials.
 
Da du auch nach C++ gefragt hast - C++ bietet die string-Klasse, die sich selbst um die Speicher-Allozierung kümmert. Dann brauchst du dich nicht um Pointer, malloc, calloc, realloc und wie sie alle heißen zu kümmern, bist trotzdem vor Buffer Overflows sicher und hast eine nur vom Speicher begrenzte Länge für die Eingaben.
 
... und das sind verdammt viele Tastenschlaege.
Vielen dank.
Weiss ich bescheid.
Ich denke mal ich habe es gefunden.
mfg

sw33t
 
In C gibts auch noch fgets(), da kannst dir dann aussuchen wie viel maximal eingelesen werden soll. Reicht normalerweise immer aus und dann bist du auch vor Bufferoverflows sicher.
 
Zurück
Oben