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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.