Hallo, habe eine Verständnisfrage zu pointern. char *p_text = "1234"; sollte von meinem Verständnis ok sein. Der Compiler legt den Text irgendwo im RAM ab und *p_text zeigt auf dessen Anfangsadresse. char *p_text; void main(void) { *p_text = "1234"; // Führt zu Problemen!!!!!! } Wobei char array[] = "hallo"; char *p_text = NULL; void main(void) { p_text = &array[0]; // sollte OK sein p_text = array; // sollte auch OK sein } Kann mir das so jemand bestätigen?
> void main(void) > { > *p_text = "1234"; // Führt zu Problemen!!!!!! > } Der Stern muss weg.
Marthin Marthinski schrieb: > Der Compiler legt den Text irgendwo im RAM ab und *p_text zeigt auf > dessen Anfangsadresse. Nein, weder zeigt *p_text auf die Anfangsadresse, noch ist es die Anfangsadresse, *p_text ist schlicht '1'. Richtig: p_text (ohne *) enthält die Anfangsadresse und zeigt damit auf den Text. > *p_text = "1234"; // Führt zu Problemen!!!!!! Ja, wegen dem * ist die Zeile reichlich unsinnig. Ohne dem ist nichts dagegen zu sagen.
*p_text = "1234"; // Führt zu Problemen!!!!!! Frage: nur reichlich unsinnig oder kann was passieren, da der Zeiger nicht "ausgerichtet" (referenziert) wurde. Der zeigt doch irgendwohin und da wird mit *p_text = "1234"; die "1234" hingeschrieben. Andere Frage: typedef struct { uint32 a; uint32 b; uint32 feld[8]; }test; test teststruk = { .a=0, .b= 0, feld="1234"}; Wäre so eine Initialisierung ok? Alternative Schreibweise?
Hast du dein C-Buch verlegt? Das sind alles C Grundlagen und hat mit Mikrocontroller und Elektronik herzlich wenig zu tun.
Marthin Marthinski schrieb: > Frage: nur reichlich unsinnig oder kann was passieren, Beides. Marthin Marthinski schrieb: > Der zeigt doch irgendwohin > da wird mit *p_text = "1234"; die "1234" hingeschrieben. Nein, eben nicht. An dieses "irgendwohin" wird die Adresse, an der das "1234" im Speicher liegt, hingeschrieben. Deshalb "reichlich unsinnig". Was du eigentlich haben willst, ist
1 | char *p_text; |
2 | ...
|
3 | p_text = "1234"; |
und das ist völlig in Ordnung so. Das ist genau das Gleiche, wie
1 | char *p_text = "1234"; |
nur eben aufgeteilt in zwei Schritte. Marthin Marthinski schrieb: > Wäre so eine Initialisierung ok? Alternative Schreibweise? Kommt darauf an, was du eigentlich haben willst. Was soll denn der Text in einem Feld aus uint32_t zu suchen haben?
Nebenbei ist:
1 | char *p_text = "1234"; |
auch eher fragwürdig, da char* (ohne const) auf einen konstanten String zeigt (genau genommen auf einen String von const char). Eigentlich könnte man (wegen des fehlenden const) über p_text die Zeichen ändern, z.B.:
1 | p_text[0]++; |
Je nach Umgebung kann das schiefgehen, nämlich dann, wenn der String tatsächlich zur Laufzeit in einem nicht änderbaren Speicher liegt, sei es physikalisch in einem ROM oder durch VM geschützt. (Auch wenn vielen das Problem nicht bewusst ist und man es entsprechend häufig so sieht.) Also entweder
1 | const char *p_text = "1234"; |
(dann kann man den String von vornherein nicht mehr ändern, ein Versuch über p_text würde schon vom Compiler angemäkelt werden). Oder:
1 | char p_text[] = "1234"; |
Damit wäre der String nicht mehr const, und kann auf jedem System legal geändert werden.
Hallo , char* p_text = "1234"; da solltest Du aber auch genügend Speicher haben damit das noch irgendwo hin'ZEIGT'. BTW dein Zeiger ist auf einem 32bit System 4 Byte gross dein String aber 5, inclusive terminierender '\0'. der String : char a_text[5] = "1234"; oder char a_text [] = "1234"; und der Zeiger: char* p_text = a_text; mach dir mal klar WAS ein ZEIGER ist! struct { uint32 a; uint32 b; uint32 feld[8]; } test = {0,1,{2,3,4,5,6,7,8,9}}; besser : struct tag_TEST { uint32 a; uint32 b; uint32 feld[8]; }; typedef struct tag_TEST tTest; tTest test1 = {0,1,{2,3,4,5,6,7,8,9}}; tTest test2 = {10,11,{12,13,14,15,16,17,18,19}}; Stefan Stefan
Stefan schrieb: > Hallo , > > char* p_text = "1234"; > > da solltest Du aber auch genügend Speicher haben damit das noch irgendwo > hin'ZEIGT'. Wo ist das Problem? p_text zeigt auf die '1'. > BTW dein Zeiger ist auf einem 32bit System 4 Byte gross > dein String aber 5, inclusive terminierender '\0'. Na und?
Stefan schrieb: > da solltest Du aber auch genügend Speicher haben damit das noch irgendwo > hin'ZEIGT'. BTW dein Zeiger ist auf einem 32bit System 4 Byte gross > dein String aber 5, inclusive terminierender '\0'. Totaler Quatsch. Stefan schrieb: > mach dir mal klar WAS ein ZEIGER ist! Vielleicht selber mal einen weiteren Blick in ein C-Buch werfen, bevor man andere mit groß geschriebenen Worten bewirft?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.