Wie funktioniert memset?



  • Mr. Rolleyes schrieb:

    void* pv;
    	int i = 10;
    	char a = 'a';
    	pv = &i;
     	printf("%d\n",  *(int*)pv ); // void Zeiger nach int* gecastet und dereferenziert.
    	pv = &a;
     	printf("%c\n", *(char*)pv ); // void Zeiger nach char* gecastet und dereferenziert.
    

    🙄

    das ist zwar richtig, aber wer mit genügend Menschenverstand wird so einen Code schreiben? Der Code ist so als würde ich auf einer Gerade laufen und dabei mich noch um die eigene Achse drehen. Klar geht das auch, aber ist völlig unnötig. 🙄



  • Mr. Rolleyes schrieb:

    Dafür sind die typenlosen void Zeiger doch da, um gecastet und zur Laufzeit an einen Datentypen gebunden zu werden.

    aber ohne cast:

    void *slow_memset (void *s, int c, size_t n)
    {
      unsigned char *p = s;  // <--- kein cast!
      while (n--)
        *p++ = c;
      return s;
    }
    

    🙂



  • ansiC bad ass schrieb:

    Mr. Rolleyes schrieb:

    Dafür sind die typenlosen void Zeiger doch da, um gecastet und zur Laufzeit an einen Datentypen gebunden zu werden.

    aber ohne cast:

    void *slow_memset (void *s, int c, size_t n)
    {
      unsigned char *p = s;  // <--- kein cast!
      while (n--)
        *p++ = c;
      return s;
    }
    

    🙂

    So gehts ohne Cast, nur bei C++ müsste man das casten, aber fürs Dereferenzieren brauchste den Cast!

    printf("%d\n",  *(int*)pv ); // <-- Doch Cast !
    

    🙂

    supertux schrieb:

    Mr. Rolleyes schrieb:

    void* pv;
    	int i = 10;
    	char a = 'a';
    	pv = &i;
     	printf("%d\n",  *(int*)pv ); // void Zeiger nach int* gecastet und dereferenziert.
    	pv = &a;
     	printf("%c\n", *(char*)pv ); // void Zeiger nach char* gecastet und dereferenziert.
    

    🙄

    das ist zwar richtig, aber wer mit genügend Menschenverstand wird so einen Code schreiben? Der Code ist so als würde ich auf einer Gerade laufen und dabei mich noch um die eigene Achse drehen. Klar geht das auch, aber ist völlig unnötig. 🙄

    Das ist doch nur ein Beispiel für die Benutzung, das das in diesem Beispielfall nicht viel Sinn hergibt ist doch klar und steht doch gar nicht zur Diskussion 🙄 🙄



  • Mr. Rolleyes schrieb:

    So gehts ohne Cast, nur bei C++ müsste man das casten, aber fürs Dereferenzieren brauchste den Cast!

    1. void* kann man nicht dereferenzieren.
    2. C++ ist absolut entbehrlich.
    🙂



  • Mr. Rolleyes schrieb:

    Das ist doch nur ein Beispiel für die Benutzung, das das in diesem Beispielfall nicht viel Sinn hergibt ist doch klar und steht doch gar nicht zur Diskussion 🙄 🙄

    ist trotzdem ein schlechtes Beispiel, denn damit "beweist" du deine These nicht. Und dass man einen void Zeiger nicht dereferenzieren kann (außer mit Hilfe eines Casts [1]) ist eine völlig andere Geschichte (und hat nichts mit deiner These zu tun).

    edit:
    [1]
    selbst das brauchst du nicht. Ich nehme dein eigenes Bsp:

    void* pv; 
        int i = 10; 
        char a = 'a';
    
        pv = &i;
        int *int_ptr = pv;
        printf("%d\n",  *int_ptr ); 
    
        pv = &a;
        char *char_ptr = pv;
        printf("%c\n", *char_ptr );
    

    😉



  • ansiC bad ass schrieb:

    Mr. Rolleyes schrieb:

    So gehts ohne Cast, nur bei C++ müsste man das casten, aber fürs Dereferenzieren brauchste den Cast!

    1. void* kann man nicht dereferenzieren.
    2. C++ ist absolut entbehrlich.
    🙂

    Zu 1.)
    Das ist richtig! Deshalb muss man den void Zeiger vorher in den entsprechenden Datentypen casten.
    Für Dich schreibe ich es gern noch einmal hin:

    printf("%d\n",  *(int*)pv ); // Cast nach int* und dereferenziert
    

    🙂

    Zu 2.)
    Weiß nicht.
    Das kann man im grunde genommen von jeder Programmiersprache sagen.



  • supertux schrieb:

    ist trotzdem ein schlechtes Beispiel, denn damit "beweist" du deine These nicht.

    Welche These? 😕

    supertux schrieb:

    void* pv; 
        int i = 10; 
        char a = 'a';
        
        pv = &i;
        int *int_ptr = pv;
        printf("%d\n",  *int_ptr ); 
    
        pv = &a;
        char *char_ptr = pv;
        printf("%c\n", *char_ptr );
    

    Was ist das denn für ein Gurkenbeispiel, da kann man doch völlig auf den void Zeiger verzichten.
    Die Verwendung des Zeigers sollte aber gezeigt werden. :p



  • Mr. Rolleyes schrieb:

    Zu 1.)
    Das ist richtig! Deshalb muss man den void Zeiger vorher in den entsprechenden Datentypen casten.

    damit dereferenziert man aber keinen void* mehr, sondern er wird als pointer auf einen anderen typ angesehen. das ist ein feiner unterschied.
    das hier:

    long a = 7;
    *(char*)a = 10;
    

    dereferenziert nicht etwa eine long-variable, sondern ihr inhalt (die 7) wird als 'char-pointer' interpretiert.

    Mr. Rolleyes schrieb:

    Zu 2.)
    Weiß nicht.
    Das kann man im grunde genommen von jeder Programmiersprache sagen.

    auf manche sprachen trifft es aber eher zu als auf andere.
    🙂



  • ansiC bad ass schrieb:

    damit dereferenziert man aber keinen void* mehr, sondern er wird als pointer auf einen anderen typ angesehen. das ist ein feiner unterschied.

    Weil er vorher in den entsprechenden Zeigertypen gecastet wird, da bin ich ganz deiner Meinung.

    ansiC bad ass schrieb:

    das hier:

    long a = 7;
    *(char*)a = 10;
    

    dereferenziert nicht etwa eine long-variable, sondern ihr inhalt (die 7) wird als 'char-pointer' interpretiert.

    Das ist allerdings, ehm... Käse.
    🙂



  • Mr. Rolleyes schrieb:

    Zu 1.)
    Das ist richtig! Deshalb muss man den void Zeiger vorher in den entsprechenden Datentypen casten.
    Für Dich schreibe ich es gern noch einmal hin:

    printf("%d\n",  *(int*)pv ); // Cast nach int* und dereferenziert
    

    🙂

    Wenn ich davor eine Zuweisung mache, dann brauche ich keinen Cast.

    Mr. Rolleyes schrieb:

    Welche These? 😕

    "Dafür sind die typenlosen void Zeiger doch da, um gecastet und zur Laufzeit an einen Datentypen gebunden zu werden."

    Mr. Rolleyes schrieb:

    Was ist das denn für ein Gurkenbeispiel, da kann man doch völlig auf den void Zeiger verzichten.
    Die Verwendung des Zeigers sollte aber gezeigt werden. :p

    Das "Gurkenbeispiel" stammt von dir, hab es nur so geändert dass es auch ohne einen einzigen (expliziten) Cast geht. Und man kann allerdings auf die void Zeiger verzichten, ich kann deine eigene Argumente auch gegen dein Bsp. benutzen.



  • supertux schrieb:

    "Dafür sind die typenlosen void Zeiger doch da, um gecastet und zur Laufzeit an einen Datentypen gebunden zu werden."

    Aber aber, ich muss doch sehr bitten, das ist doch keine These.
    Das ist Fakt.
    Manche Autoren beschreiben den Sachverhalt in etwa so:

    Der void-Zeiger
    Eine Besonderheit im Zusammenhang mit Zeigern spielt der Datentyp void. Ein Zeiger auf den Datentyp void (void*) ist ein Zeiger, der an keinen bestimmten Datentyp gebunden ist. Soll über einen solchen void-Zeiger auf Daten zugegriffen werden, so muss dieser zuerst in einen entsprechenden typisierten Zeiger (char*, short* usw. ) konvertiert werden, damit die Anzahl der zu übertragenden Bytes vom Compiler berechnet werden kann.

    supertux schrieb:

    Das "Gurkenbeispiel" stammt von dir, hab es nur so geändert dass es auch ohne einen einzigen (expliziten) Cast geht. Und man kann allerdings auf die void Zeiger verzichten, ich kann deine eigene Argumente auch gegen dein Bsp. benutzen.

    Ja, du hast gezeigt, das man auf den void Zeiger verzichten kann, klar.
    Ich wollte aber zeigen, wie man ihn benutzt. 🙂



  • Mr. Augenschoner schrieb:

    Ja, du hast gezeigt, das man auf den void Zeiger verzichten kann, klar.
    Ich wollte aber zeigen, wie man ihn benutzt. 🙂

    ich ebenso, oder habe ich etwa die void Pointer falsch benutzt?


Anmelden zum Antworten