mikrocontroller.net

Forum: Compiler & IDEs Problem mit strcat


Autor: Deramon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe da ein kleines Problem mit strcat. Bei dem 2. strcat Befehl
macht der MC einen Reset. Kann mir jemand sagen warum das so nicht
funktioniert ? Aus uint8_t x soll der string "04" werden. (Aktuelle
avr-gcc version)


char *strtmp = "";
char *strtmp2 = "";
uint8_t x = 4;

itoa(x,strtmp2,10);
if(x < 10)
{
  strcat(strtmp, "0");
  strcat(strtmp,strtmp2);
}



MfG
Deramon

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann mir jemand sagen warum das so nicht funktioniert?

Weil Du Dir die Grundlagen von C erst nochmal rekapitulieren mußt. ;-)

Sowohl für strtmp als auch für strtmp2 hast Du exakt je 1 Byte an
Speicherplatz reserviert, der für die terminierende '\0' belegt
wird.
Wie willst Du da noch weitere Zeichen reinschreiben können?

Autor: Deramon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm.. ja, das mit den Pointern ist noch so ne Sache :)
Folgender Code funktioniert und bei meinem LCD wird "04" angezeigt,
wenn ich strtmp ausgeben.
Da nur ein Byte reserviert ist, kann es mir dann also passieren das ich
einen für eine andere variable reservierten Bereich überschreibe und das
zum Reset im 1. Beispiel geführt hat ?


char *strtmp = "";
uint8_t x = 4;

itoa(x,strtmp,10);
if(x < 10)
{
  strcat(strtmp, "0");
  strtmp = strrev(strtmp);
}

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es kann nicht nur passieren -- es wird passieren.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> das mit den Pointern ist noch so ne Sache :)

Grundregel #1: vergewissere Dich, wohin der Zeiger eigentlich zeigt.
Ein Zeiger muß auf ein gültiges Objekt zeigen, also auf irgendwas, das
den von Dir benötigten Speicherplatz in ausreichender Menge besitzt.

#2: warum nimmst Du dann überhaupt Zeiger?  Sie sind völlig
überflüssig in dieser Situation.

char strtmp[8] = {0};
char strtmp2[8];

uint8_t x = 4;

itoa(x,strtmp2,10);
if(x < 10)
{
  strcat(strtmp, "0");
  strcat(strtmp,strtmp2);
}

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.