Forum: Mikrocontroller und Digitale Elektronik Minifrage - gcc strcat() - erweitert eigenständig die die Arrays


von Jens (Gast)


Lesenswert?

Hallo,

ich hab folgendes Mini-Programm. (Zahlen in Zeichen umwandeln
und mit strcat() in einem gemeinsamen Array speichern)
1
char mydata[100];
2
3
void myadd(u16 data) {
4
   char tmp[80];
5
   
6
   ltoa(data, tmp, 10);
7
   strcat(mydata, tmp);
8
   strcat(mydata, "-");
9
   
10
   printf("%s\n", mydata); // Debug...
11
}
12
13
int main(void) {
14
   u16 counter = 0;
15
   while (1) {
16
       counter++;
17
       myadd(counter);
18
   }
19
}

Wie oft ich auch die Zahl in mydata schreibe,
die Ausgabe wird immer größer - vermutlich
bis kein Flashspeicher mehr da ist.

Ich find nur nirgends diesbezüglich Infos.

Das Verhalten könnte später kritsch werden.
Wollte nur kurz fragen ob das so richtig ist... :)
Möchte ungern etwas einbauen was ich nicht richtig
verstehe ...

Vielen Dank
Jens

von Klaus W. (mfgkw)


Lesenswert?

Das Ganze ist unkritisch, solange du in den 80 Bytes bleibst
(inkl. abschließender 0).
Alles danach ist Glückssache.

Außerdem hat das mit Flash nix zu tun, es geht hier um RAM.

> Das Verhalten könnte später kritsch werden.

Das wird es sicher.

> Wollte nur kurz fragen ob das so richtig ist... :)

Es ist grundfalsch.

> Möchte ungern etwas einbauen was ich nicht richtig
> verstehe ...

C-Buch lesen und verstehen!
Das hat schon vielen geholfen.
Aber viel mehr probieren es ohne...

von Klaus W. (mfgkw)


Lesenswert?

> Ich find nur nirgends diesbezüglich Infos.

Dann will ich nicht fragen, wie du gesucht hast :-)

von strcat (Gast)


Lesenswert?

eine gute idee wäre schon einmal, auf deine max array size zu testen. 
Sonst schreibst du dir über das array hinaus in speicherbreiche rein. da 
kommen dann noch ganz andere sachen. vergiss beim überprüfen der länge 
aber nicht das \0

von Jens (Gast)


Lesenswert?

super danke, für die schnelle hifle

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jens schrieb:
> Hallo,
>
> ich hab folgendes Mini-Programm. (Zahlen in Zeichen umwandeln
> und mit strcat() in einem gemeinsamen Array speichern)
>
>
1
> char mydata[100];
2
> 
3
> void myadd(u16 data) {
4
>    char tmp[80];
5
> 
6
>    ltoa(data, tmp, 10);
7
>    strcat(mydata, tmp);
8
>    strcat(mydata, "-");
9
> 
10
>    printf("%s\n", mydata); // Debug...
11
> }
12
> 
13
> int main(void) {
14
>    u16 counter = 0;
15
>    while (1) {
16
>        counter++;
17
>        myadd(counter);
18
>    }
19
> }
20
> 
21
>
>
> Wie oft ich auch die Zahl in mydata schreibe,
> die Ausgabe wird immer größer - vermutlich
> bis kein Flashspeicher mehr da ist.

Nö, bis kein RAM mehr vorhanden ist.

myadd hängt nur was an mydata an, aber niemand "leert" mydata. Das 
könnte zB erledigt werden durch
1
mydata[0] = '\0';
am Ende von myadd oder zu Beginn. Dann lassen sich allerdings durch 
mehrfache Aufrufe keine längeren Strings mehr zusammenbasteln, was ja 
unerwünscht ist. Andernfalls müsste es ausserhalb von myadd geschehen, 
etwa
1
   ...
2
   if (counter % 4 == 0)
3
      mydata[0] = '\0';
4
   counter++;
5
   ...

von High Performer (Gast)


Lesenswert?

strcat hängt zwei Strings aneinander. Das terminierende Nullzeichen des 
Zielstrings wird überschrieben mit dem ersten Zeichen des Quellstrings. 
Nach dem Kopiervorgang wird wieder ein Nullzeichen angehängt.
Beim nächsten Aufruf wird dann an diesen String wieder das neue Zeug 
angehängt.

Wie die anderen schon geschrieben haben: es gibt Beschreibungen der 
Funktionen im Netz. Ich will nicht so streng sein, da ich nicht 
verlangen möchte, dass man, bevor eine Frage gestellt wird, erst 
stundenlang selbst recherchiert. Dann wär's hier sehr ruhig ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.