c-array werte zuweisen

Gast #2805715
Lesenswert?

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
#2805856
Lesenswert?

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.
Gast #2806581
Lesenswert?

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
#2806672
Lesenswert?

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.
Gast #2807468
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren