Pointer auf?



  • Was hat denn diese Schreibweise zu bedeuten?

    unsigned char *kptr = key, trans;

    Wobei key ein char array ist und trans nicht initialisiert wurde



  • unsigned char *kptr = key, trans;

    Du deklariest einen Pointer namens kptr und zeigst damit auf key. Ausserdem deklarierst du noch eine Variable trans mit dem Typ unsigned char.



  • Aha jetzt ist mir einiges klar, hätte noch eine Frage

    void crypt(unsigned char *s)
    {
    	unsigned i, j, t;
    	unsigned char trans;
    	init();
    	for(i=0,j=0;*s;*s++) {
    		i = (i + 1) % 256;
    		j = (j + sbox[i]) % 256;
    		trans = sbox[i];
    		sbox[i] = sbox[j];
    		sbox[j] = trans;
    		t = (sbox[i] + sbox[j]) % 256;
    		*s ^= sbox[t];
    	}
    }
    

    Was ist das?
    for(i=0,j=0;*s;*s++)//Solange *s nicht auf null zeigt oder wie?

    Und das?
    *s ^= sbox[t];//was soll dieses ^



  • for(i=0,j=0;*s;*s++)

    Dereferenzierung von s findet statt. Die schleife läuft, solange *s != 0 ist. *s++ Geht einfach alle Buchstaben durch.
    Das funktioniert weil alle char strings mit einer 0 terminiert werden.

    *s ^= sbox[t]

    ^= ist eine Bitoperation, es macht z.B. aus 11001 und 10011 die zahlen 1010.
    Das funktioniert, weil für unterschiedliche Bits an den Operanden ein Bit geliefert wird.
    Schreiben wir einmal untereinander:

    11001
    10011
    -----
    1010

    Die 0 davor wird weggelassen.

    Das wird wohl die Stelle in deiner Funktion sein, in der der Char mit dem Wert verschlüsselt wird.



  • Ach jetzt verstehe ich wie das funktionieren soll das ^ ist wohl das xor das bei der rc4 verschlüsselung benutzt werden soll.
    Gut jetzt muss ich das ganze nur noch in mips assembler umschreiben und abgeben nichts leichter als das 🙄



  • *s++ macht zwar was gewünscht ist, aber die Dereferenzierung ist Schwachsinn. s++ würde auch reichen (und zwar, weil sinngemäß *(s++) passiert und das dereferenzierte Zeichen dann nicht benutzt wird).

    EDIT: Am besten gleich ++s 😉



  • LordJaxom schrieb:

    EDIT: Am besten gleich ++s 😉

    meinste das ändert was? der letzte ausdruck im 'for' wird doch erst nach'm schleifendurchlauf ausgeführt.



  • Ja, "s++" erzeugt eine temporäre Variable, die hier jedoch nicht benötigt wird - dauert also etwas länger als "++s".



  • CStoll schrieb:

    Ja, "s++" erzeugt eine temporäre Variable, die hier jedoch nicht benötigt wird....

    ...und deswegen wird auch keine erzeugt. im letzten 'for'-ausdruck wird nur hochgezählt aber sonst nix weiter damit gemacht.



  • Mir war auch klar dass das alles wegoptimiert wird, aber sollte man deshalb *s++ statt ++s schreiben, "weil das sowieso nichts macht"? Nein, ich denke nicht 😉

    Zumal die Sache anders aussehen kann wenn s ein größeres Objekt ist.



  • LordJaxom schrieb:

    Mir war auch klar dass das alles wegoptimiert wird, aber sollte man deshalb *s++ statt ++s schreiben, "weil das sowieso nichts macht"? Nein, ich denke nicht 😉

    du hast natürlich recht, das '*' ist überflüssig und stört nur beim lesen des codes



  • net schrieb:

    CStoll schrieb:

    Ja, "s++" erzeugt eine temporäre Variable, die hier jedoch nicht benötigt wird....

    ...und deswegen wird auch keine erzeugt.

    Afaik ist Optimierung freiwillig - d.h. der Compiler darf die temp. Variable wegoptimieren, aber er muß nicht.



  • CStoll schrieb:

    der Compiler darf die temp. Variable wegoptimieren, aber er muß nicht.

    so einen compiler will ich aber nicht haben 😡



  • es wird wohl kaum n compiler geben, der das nicht wegoptimiert. und davon kann man ausgehen. ob man s++ oder ++s schreibt, ist egal. natürlich sollte man nicht *s++ schreiben, das macht einfach keinen sinn.



  • Den Code habe ich von http://www.linux-magazin.de/Artikel/ausgabe/1997/11/Krypto/krypto5.html

    hassmails also nicht zu mir 😃

    Noch eine allgemeine Frage: Wieso sollte man ein char element als unsigned deklarieren ist das nicht quatsch?



  • blizzarac schrieb:

    Wieso sollte man ein char element als unsigned deklarieren ist das nicht quatsch?

    sollte man garnicht. ASCII ist nur 7-bittig und wird damit von signed und unsigned char abgedeckt. ob "char" nun signed oder unsigned ist, wen kuemmerts. ascii zeichen koennen allemal dargestellt werden.



  • Hätte auch mal ne Frage. Ich bin mir nicht mehr sicher aber meines Wissens zeigt ein Pointer "der auf nichts zeigt" auf NULL. Wenn nicht ist meine Frage Sinnlos und ihr könnt sie vergessen 😃
    Ein Array sind ja eigentlich mehrere pointer, somit müsste ein Arry mit 10 Elementen doch 10 mal auf NULL zeigen oder? Solange nix drinsteht, versteht sich.

    EDIT: Frage Nummer2:

    #include <stdio.h>
    
    int main()
    {
    	char c[20];
    	int i;
    
    	for (i=0;i!='\n'&&i<=20;++i) {
    		c[i] = getch();
    		putchar('*');
    	}
    }
    

    Ich wollte mal eine Eingabe durch sterne ersetzen (ok ersetzen nicht, weil getch() zeigts ja erst gar nicht an aber ok 😃 )
    Wenn ich jetzt aber eine Eingabe mache bricht er nach 10 Zeichen ab. Bin ich blöd oder steht da 20???
    Wieso nimmt er nicht 20 Zeichen?



  • Also soweit ich weiss zeigen nicht initialisierte Pointer irgentwo hin aber nicht automatisch auf NULL, was sie gefährlich macht und meistens zu Programmabbrüchen führt.



  • ein pointer ist ne adresse.
    ein char[10] "zeigt" irgendwo in den speicher, wo 10 chars stehen.

    ein pointer zeigt also nicht auf NULL, er IST NULL.
    ein pointer zeigt aber z.b. auf einen int, also IST er die adresse der stelle im speicher, wo der wert von diesem int steht.



  • Ok danke dir 😉 (bzw euch)
    Und mein "Programm" da oben? Ich blicks einfach net warum des nach 10 Eingaben abbricht


Anmelden zum Antworten