Forum: Compiler & IDEs Konstant Sting


von Achim (Gast)


Lesenswert?

Hi!
Ich habe folgenden Beitrag im Forum gefunden:
http://www.mikrocontroller.net/forum/read-4-45518.html#73154

Da steht, dass
char* myString="0000000";
eine Konstante im flash bereitstellt. Und eine änderung fehlschlagen
würde. Wiso denn das ???
Man kann doch ohne probleme auf den Flash (über den pointer)
zugreifen.

wiso ist es eigentlich in WINAVR zulässig variablen zu deklarieren /
initialisieren mit einem initialisierungswert. normal ist sowas in C
doch garnicht zulässig !

MfG Achim

von Chris (Gast)


Lesenswert?

> Man kann doch ohne probleme auf den Flash (über den pointer)
> zugreifen.
Nur lesend.

> normal ist sowas in C doch garnicht zulässig !
Variablen bei der Definition zu initialisieren? Aber natürlich ist das
zulässig.

char* p = "0000";
Hier wird "0000" AFAIK im RAM abgelegt, auch bei avrgcc. Allerdings
ist es dem Compiler (zumindest bei C++, weiß nicht ob es bei C auch so
ist) gestattet, solche Strings zu vereinigen. Nehmen wir folgenden
Code:
char* foo = "Hello World!";
char* bar = "!";
Der Compiler darf AFAIK eine Zeichenkette "Hello World!"
bereitstellen. foo zeigt auf den Beginn dieses Strings, bar auf den
selben String, aber eben auf das Ausrufezeichen.

Wenn du einen String verändern willst, ist es besser ihn so zu
deklarieren:
char p[] = "blub";
Dann kann nichts schiefgehen.
Wenn du einen String nicht verändern willst, deklarier ihn als const
char* (und außerdem mit diesen PROGMEM-Makros, damit der String im ROM
landet).

von Achim (Gast)


Lesenswert?

Wiso denn ??????
wenn ich

char* myString="0000000";

schreib, wird ein zeiger erstellt der auf die speicherstelle
"0000000" auch wenn "0000000" ein string ist.
An die Adresse kann ich auch schreiben ! Wiso denn auch nicht ?? Ausser
Die CPU befindet sich im Protected mode !

Und wenns mir spass macht kann ich auch noch den zeiger später noch auf
ne andere adresse zeigen lassen !

Kann mir jemand sagen wiso das nicht zulässig ein soll ??? Ich mache
hier KEIN const char* !

von ElMachel (Gast)


Lesenswert?

Servus,

>Wiso denn ??????
>wenn ich
>char* myString="0000000";
>schreib, wird ein zeiger erstellt der auf die speicherstelle
>"0000000" auch wenn "0000000" ein string ist.

also,dein obiger Zeiger zeigt auf den Anfang der Adresse wo dein String

"0000000" abgelegt wurde, diese Adresse bestimmt der Compiler, das
hat mit Strings nichts zu tun.

Lies dir bitte den Artikel und ein Zeigerkapitel eines C-Buchs nochmal
durch.

Außerdem verwendest du ziemlich viel "!", find ich persönlich
irgendwie agressiv.

mfg
Christian

von Rufus T. Firefly (Gast)


Lesenswert?

Sollte die Stringkonstante im Flash-ROM stehen (was sie nur tut, wenn
bei AVR-GCC prog_mem als storage specifier davor steht), dann ist ein
Schreibzugriff zwar theoretisch möglich, zeigt aber keinerlei
Auswirkungen, da das ROM so nicht umprogrammiert werden kann.

Empfehlenswert: Kernighan & Ritchie, "Programmieren in C", zweite*
Auflage, Hanser Verlag

Solche Feinheiten wie prog_mem sind darin allerdings nicht beschrieben,
da das implementierungsspezifische Details des C-Compilers sind.

*) die erste Auflage scheint maschinell übersetzt zu sein und schildert
das sogenannte K&R-C, das noch keine Prototypen und so gut wie keine
Typprüfung kennt. Die zweite Auflage, die Anfang der 90er Jahre
erschien, beschreibt hingegen ANSI-C und ist hervorragend ins Deutsche
übersetzt.

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
Noch kein Account? Hier anmelden.