pointer (Eine Frage zu Pointern)

Gast #2408176
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?
#2408188
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.
Gast #2408258
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?
#2408268
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?
#2408294
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.
Gast #2408298
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
#2408323
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren