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" );
Falls du Werte eingeben möchtest musst du das so tun char a[]={1,0,1,0,1,0,1,0};
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
>Bei solchen Fragen wundert es mich immer warum der TO das nicht einfach >ausprobiert Bei vielen Fragen ja, aber nicht bei dieser.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.