Guten Tag!
Ich habe ein Array of Char in C wie folgt deklariert:
char a[]="10101010";
Dieses wird an einie Funktion übergeben:
void array(char* str){
while(*str){
//Do something
*str++;
}
}
Jetzt möchte ich dem Array a[] neue Werte zuweisen.
Muss ich das jetzt über eine Schleife z.B.
for(int i=0;i<8;i++){
a[i]='1';
}
machen oder gibt es die Möglichkeit der direkten Zuweisung wie
a[]="11111111"
?
Mit freundlichen Grüßen
carry
carry schrieb:> machen oder gibt es die Möglichkeit der direkten Zuweisung wie>> a[]="11111111"
wenn dein array ein string ist, was hier offensichtlich der Fall ist
kann man auch string funktionen verwenden.
strcpy( a, "11111111" );
carry schrieb:> Danke euch, funktioniert!
Schreib da aber bloß nichts längeres rein.
char a[]="10101010";
legt ein Array mit der Größe 8 + 1 (für Terminator \0) an.
Das heißt, Du darfst keine längeren Strings als welche mit maximaler
Länge von 8 mittels strcpy() reinschreiben, sonst hast Du den
klassischen Buffer-Overflow.
Habs gerade mal ausprobiert.
Funktioniert trotzdem einwandfrei.
Werde aber die Array-Grenzen später noch festlegen, bevor ich noch
unerwünschte Überraschungen bekommen :)
carry schrieb:> Habs gerade mal ausprobiert.> Funktioniert trotzdem einwandfrei.
Zufällig.
Du bügelst halt Speicher nieder, der nicht zum Array gehört. Solange das
Array die einzige Variable ist, merkst du nichts. Wenn aber direkt
hinter dem Array die Variable liegt, die steuert ob die
Herz-Lungenmaschine abgeschaltet wird oder nicht, dann ist das nicht so
prickelnd, wenn sich die abschaltet, nur weil der String beim strcpy
einen Array Overflow verursacht.
Mark Brandis schrieb:> Zum Glück gibt es auch strncpy()
naja da muss man auch wissen was mach macht.
strncpy( a, "123456789", sizeof(a) );
geht auch fehlerfrei - die Frage ist was später passiert.
Also nehme ich um sicher zu sein
strncpy(a, "any length",sizeof(a)-1);
a[sizeof(a)-1]='\0';
Damit sollte dann ein Overflow ausgeschlossen sein oder nicht?
Danke nochmal für die Tips!
Bei solchen Fragen wundert es mich immer warum der TO das nicht einfach
ausprobiert. Die paar Zeilen zu schreiben macht weniger Arbeit als hier
zu posten und die eigene Erfahrung festigt sich ja bekanntlich besser im
Gedächtnis als alles andere.
Das werde ich später auch wohl noch machen.
Allerdings habe ich keine Lust an der Werkbank zu frühstücken und ich
mich absichern wollte, da, wie bereits festgestellt, Fehler nur
sporadisch Auswirkungen auf die Funktion haben.
Das sind die zwei simplen Gründe.
Ich hoffe ich konnte dir deine Frage beantworten.
Mit freundlichen Grüßen
Carry
Carry schrieb:> Also nehme ich um sicher zu sein>> strncpy(a, "any length",sizeof(a)-1);> a[sizeof(a)-1]='\0';>> Damit sollte dann ein Overflow ausgeschlossen sein oder nicht?
Overflow erst mal schon. Wird das Array dynamisch allokiert (ok, ist auf
einem AVR eher selten der Fall), dann wird das schon etwas aufwändiger -
weil man dann auch noch die allokierte Länge ständig mitführen muss.
Allerdings ist aber die Sicherheit auch trügerisch.
Denn man weist ja einem Array nicht einfach so einen String zu, sondern
man möchte etwas damit machen. Vergleiche ich den String danach irgendwo
anders mit "any length", dann sind die beiden eben nicht gleich, weil in
a eben nicht "any length" drinnen steht. Und da fangen dann die
Folgefehler an.
Natürlich ist auch klar, dass diese Fälle und Probleme hier im
Demonstrationsbeispiel offensichtlich und klar sind. In einem richtigen
Programm, bei dem die Dinge weiter verstreut sind sind sie aber alles
andere als offensichtlich und sehr oft schwer zu finden. strncpy ist
kein Allheilmittel nach dem Muster: tausche strcpy gegen strncpy aus und
du hast keine Probleme mehr.
Karl Heinz Buchegger schrieb:> Carry schrieb:>> Also nehme ich um sicher zu sein>>>> strncpy(a, "any length",sizeof(a)-1);>> a[sizeof(a)-1]='\0';>>>> Damit sollte dann ein Overflow ausgeschlossen sein oder nicht?>> Overflow erst mal schon. Wird das Array dynamisch allokiert (ok, ist auf> einem AVR eher selten der Fall), dann wird das schon etwas aufwändiger -> weil man dann auch noch die allokierte Länge ständig mitführen muss.
Man fällt doch schon auf die Schnau..., wenn man das in einer Funktion
macht.
So wie der TO das eigentlich auch vor hat.
Dann ist sizeof(a) == sizeof(char*) und das ist nicht das gewünschte.