Forum: Compiler & IDEs c-array werte zuweisen


von carry (Gast)


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

von Peter II (Gast)


Lesenswert?

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" );

von Chris (Gast)


Lesenswert?

Falls du Werte eingeben möchtest musst du das so tun

char a[]={1,0,1,0,1,0,1,0};

von carry (Gast)


Lesenswert?

Japs sollte nen String sein.
Danke euch, funktioniert!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von carry (Gast)


Lesenswert?

Habs gerade mal ausprobiert.
Funktioniert trotzdem einwandfrei.
Werde aber die Array-Grenzen später noch festlegen, bevor ich noch 
unerwünschte Überraschungen bekommen :)

von Karl H. (kbuchegg)


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.

von Mark B. (markbrandis)


Lesenswert?

Zum Glück gibt es auch strncpy()

von Peter II (Gast)


Lesenswert?

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.

von Carry (Gast)


Lesenswert?

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!

von Dennis S. (eltio)


Lesenswert?

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.

von Carry (Gast)


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

von Wichtige Regel (Gast)


Lesenswert?

>Bei solchen Fragen wundert es mich immer warum der TO das nicht einfach
>ausprobiert

Bei vielen Fragen ja, aber nicht bei dieser.

von Karl H. (kbuchegg)


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.

von DirkB (Gast)


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.

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.