Forum: Mikrocontroller und Digitale Elektronik pointer (Eine Frage zu Pointern)


von Marthin Marthinski (Gast)


Lesenswert?

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?

von cler (Gast)


Lesenswert?

> void main(void)
> {
>    *p_text = "1234";  // Führt zu Problemen!!!!!!
> }
Der Stern muss weg.

von Stefan E. (sternst)


Lesenswert?

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.

von Marthin Marthinski (Gast)


Lesenswert?

*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?

von ... (Gast)


Lesenswert?

Hast du dein C-Buch verlegt?
Das sind alles C Grundlagen und hat mit Mikrocontroller und Elektronik 
herzlich wenig zu tun.

von Stefan E. (sternst)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

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