www.mikrocontroller.net

Forum: Compiler & IDEs zwei char variablen


Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe zwei variablen definiert:

char s[6]="blabla";
char r[6]="hahaa";

wenn ich jetzt die variablen auslese, bzw ausgebe mit

for(c=0;c<6;c++)
{_delay_ms(1); UDR=r[c];}

wird mir der Inhalt von der s[6] Variable angezeigt, und nicht von der
r[6], sobald ich die s[6] variable lösche, wird der Inhalt der r[6]
Variable angezeigt also korrekt,

ist sowas möglich (c-compiler ist auf Optimum Size eingestellt)?
tronic

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein "s"-String is zu lang. Du hast 6 bytes alloziert und sieben
reingeschrieben (6 Zeichen plus Stringende).

Gruss,
Thorsten

Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ok, war nur ein beispiel also s[10] und counten <10,

das ist korrekt, kann ja nicht der Grund sein, wieso die falsche
Variable ausgegeben wird.
thx
tronic

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, ich meine auch nicht dass das Zählen das Problem wäre, sondern die
Initialisierung. Wenn Du einen String "char s[6] erzeugst, wird ein
char *s erzeugt, der auf s[0] zeigt und ausserdem Speicherplatz für 6
char Variablen reserviert, auf den in unserem Beispiel dann mit s + n *
sizeof(char) zugegriffen wird. Schreibst Du nun was in s[7] wird das
nächste byte (in Deinem Fall möglicherweise char *r, der dann
irgendwohin zeigt) überschrieben und Du hast einen klassischen buffer
overrun.
Schon mal mit char s[7]="blabla"; probiert?

Gruss,
Thorsten

Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahaa... werd demfall das ma kontrollieren,
merci
tronic

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn Du einen String "char s[6] erzeugst, wird ein
> char *s erzeugt

Das ist Unsinn.
Wenn du einen
 char s[6]
definierst, dann werden auch nur 6 Bytes im Speicher reserviert.
Den char* den du da ansprichst, gibt es schlicht und ergreifend
einfach nicht. Der existiert nur in den Tabellen des Compilers
in denen er Buch führt, wo im Speicher er welche Variable
hingelegt hat.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.