Pointer und Arrays



  • Hallo,

    wer könnte mir erklären warum ,der obere Code nicht läuft, der untere jedoch schon? muss ich tatsächlich immer ein char[] statt char* nehmen? ich dachte bisher irgendwie, das wäre dasselbe, ein pointer auf ein den beginn eines char-array:

    char[] = &char[0] = char*

    #include "stdafx.h"
    #include "windows.h"
    
    char *rStr;
    char *kStr;
    char *sStr;
    
    void VernamCrypt(char sString[], char kString[],char rString[])
    {
    	int i = 0, j = 0;
    	do
    	{
    		rString[i] = sString[i] ^ kString[j];  //unhandled exception: acces violation
    		if (rString[j++] == '\0') j=0;
    	} while(sString[i++] != '\0');
    }
    
    int main(int argc, char* argv[])
    {
    
    	rStr = "ResultString";
    	kStr = "KeyString";
    	sStr = "SourceString";
    
    	VernamCrypt(rStr,kStr,sStr);
    
    	::MessageBox(0,sStr,rStr,MB_OK);
    
    	return 0;
    }
    

    Das geht aber....

    char rStr[256] = "ResultString";
    char kStr[256] = "KeyString";
    char sStr[256] = "SourceString";
    
    void VernamCrypt(char sString[], char kString[],char rString[])
    {
    	int i = 0, j = 0;
    	do
    	{
    		rString[i] = sString[i] ^ kString[j];
    		if (rString[j++] == '\0') j=0;
    	} while(sString[i++] != '\0');
    }
    
    int main(int argc, char* argv[])
    {
    
    	VernamCrypt(rStr,kStr,sStr);
    
    	::MessageBox(0,sStr,rStr,MB_OK);
    
    	return 0;
    }
    

    😮



  • Hi,
    ich denk das obere sollte schon gehen, musst halt speicher dafür reservieren. so zeigen die dinger doch auf nix, oder ?



  • doch, sie zeigen auf was. auf String-Literale, und die dürfen nicht verändert werden



  • btw:
    ich finde die namen rString, kString und sString nicht gerade gluecklich gewaehlt



  • Hi,

    ...jo, darum gings mir jetzt aber nicht - auch wenn du eigentlich recht hast 😉

    so ganz versteh ich aber nicht, warum in es in der eine Variante funzt und in der anderen nicht. Zuweisung bei Initaliserung und Zuweisung erst stpäter machen da so eine Unterschied 🙄

    btw.: Warum ich dieses tolle deutsche Forum erst jetzt gefunden und mich davor in englischen durchgeschlagen habe.... 😮

    *edit*: sogar in meinen Schriftdeutsch muss ich Massenhaft Bugs eliminieren 😃



  • ähm, wie ich schon sagte, die Pointer zeigen auf konstanten Speicher. Das hat nix mit Zuweisung oder Initialisierung zu tun.



  • "hallo"

    dies ist ein sogenanntes 'string literal'

    dieses literal ist sowas von konstant, dass es konstanter nicht mehr geht.

    stell dir mal vor, was passiert wenn jemand

    "hallo"[1]='e';

    schreiben wuerde.

    das schaut doch komisch aus (und fuehrt zu einem absturz, da "hallo" nicht geaendert werden darf)

    wenn du nun
    char* p="hallo";
    schreibst
    (was eigentlich falsch ist, da es char const* p="hallo"; heissen muesste - leider darf man aber auch char* p="hallo"; schreiben :()
    dann darfst du "hallo" natuerlich auch nicht aendern.

    denn
    p[1]='e';
    waere ja das selbe wie oben...

    bei
    char p[]="hallo";
    ist dies anders.
    da dies fuer

    char p[6];
    strcpy(p,"hallo");

    steht.
    p besitzt also "hallo" und zeigt nicht nur darauf.
    deshalb darfst du "hallo" hier aendern.

    falls du dich jetzt fragst was das soll:
    ja, pointer sind ein ekliges kapitel!


Anmelden zum Antworten