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 fuerchar 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!