Stringende in C bei µC

#1689561
Lesenswert?

Das hat mit void* jetzt aber ziemlich genau nichts zu tun.
Ein char* kann auf einen nullterminierten String zeigen,
oder auf einen nicht mit 0 terminierten (und ebenso auf ein
einzelnes char natürlich).
Ebenso wie void*.

Welche der möglichen Bedeutungen ein char* hat, muß der
Programmierer wissen.
#1689641
Lesenswert?

Und es macht vor allem besonders deutlich, daß der void* auf char
zeigt, oder was?

Und wie kommst du auf die Schnapsidee, daß void* dafür eingeführt wurde?

Sorry, aber diese Behauptung ist etwas verwegen und nicht
gerade zielführend.

Wenn man einen Zeiger auf char hat, wird doch kein vernünftiger
Mensch den als void* deklarieren.

Es gibt keine unterschiedlichen Datentypen für terminierte
und nichtterminierte Strings in C.
Gast #1689650
Lesenswert?

Klaus Wachtler schrieb:
> Und wie kommst du auf die Schnapsidee, daß void* dafür eingeführt wurde?
wo habe ich das geschrieben? Ich habe gemeinst das für beliebiege Daten 
ein void* geeigneter ist als ein char*

> Wenn man einen Zeiger auf char hat, wird doch kein vernünftiger
> Mensch den als void* deklarieren.
und warum nicht? Wenn ich in einem C Programm ein char* sehen, dann gehe 
ich erstmal davon aus das ich ihn z.b. mit Printf ausgeben kann. Bei 
void*  weiss ich schon mal das das nicht geht bzw. sinnvoll ist.

> Es gibt keine unterschiedlichen Datentypen für terminierte
> und nichtterminierte Strings in C.
das ist ja klar, weil es ja in C überhaupt keine strings gibt - es gibt 
nur zeiger.
#1689674
Lesenswert?

Peter schrieb:
>> Wenn man einen Zeiger auf char hat, wird doch kein vernünftiger
>> Mensch den als void* deklarieren.
> und warum nicht? Wenn ich in einem C Programm ein char* sehen, dann gehe
> ich erstmal davon aus das ich ihn z.b. mit Printf ausgeben kann. Bei
> void*  weiss ich schon mal das das nicht geht bzw. sinnvoll ist.

Wenn man die "Unterminiertheit" eines Strings im Code sichtbar machen 
will, dann macht man das mit einem geeigneten typedef, nicht mit einem 
void*. Letzterer hat in vielen Punkten eine andere Semantik als jeder 
andere Pointer-Typ. Schonmal versucht, Zeigerarithmetik mit void* zu 
machen? (Ja, ich weiss, mit GCC geht es, das ist aber eine 
GCC-Erweiterung)

Jeder mit ein bisschen Erfahrung in C weiss bei einem "char *", dass man 
den nur dann den Standard-Stringfunktionen vorwerfen darf, wenn das 
Zeigerziel ein paar Zusatzbedingungen erfüllt (\0-terminiert für 
Input-Parameter, ausreichend Platz vorhanden bei Output-Parametern 
etc.). Nichtmal bei allen Funktionen aus string.h ist immer garantiert, 
dass der String terminiert ist, siehe z.B. strncpy().

Andreas
Gast #1689680
Lesenswert?

Andreas Ferber schrieb:
> Wenn man die "Unterminiertheit" eines Strings im Code sichtbar machen
> will, dann macht man das mit einem geeigneten typedef, nicht mit einem
> void*.

und was hat eine block von zufallsdaten überhaupt noch mit einem String 
zu tun? Es geht ja gerade darum das darin "irgend etwas" ist. Damit ist 
das für mich kein String sondern es sind Daten.
#1689691
Lesenswert?

Peter schrieb:
> und was hat eine block von zufallsdaten überhaupt noch mit einem String
> zu tun? Es geht ja gerade darum das darin "irgend etwas" ist. Damit ist
> das für mich kein String sondern es sind Daten.

"zufallsdaten" hast erst du daraus gemacht. Dem OP nach sollen es 
zufällige ASCII-Zeichen sein.

Peter schrieb:
> Alex Glaser schrieb:
>> und ich schreibe random ascii zeichen rein
> dann ist es aber kein String mehr.

Warum soll das kein String sein? Definierst du einen "String" etwa 
darüber, ob die Abfolge der Zeichen darin irgendeinen Sinn ergibt?
#1689717
Lesenswert?

Peter schrieb:
> und was hat eine block von zufallsdaten überhaupt noch mit einem String
> zu tun? Es geht ja gerade darum das darin "irgend etwas" ist. Damit ist
> das für mich kein String sondern es sind Daten.

Selbst dann wäre void* schlicht semantisch falsch, stattdessen wäre z.B. 
uint8_t* angebracht.

void* zeigt auf "irgendetwas", aber nicht auf etwas mit "irgendetwas" 
drin. Es gibt kein Array von void!

Andreas

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