Forum: Mikrocontroller und Digitale Elektronik Pointer auf gespeicherte Adresse


von C. H. (hedie)


Lesenswert?

Hallo zusammen...

Folgendes szenario:

Ich muss Text unterschiedlicher Länge abspeichern zur Laufzeit.
Dazu reserviere ich Speicher mit malloc.
Diese Adresse speichere ich ab.

Dannach möchte ich meinen Text dorthin kopieren.
1
info->btn_text_addr = malloc((strlen(ButtonText) + 1) *sizeof(char));
2
3
strcpy( info->btn_text_addr ????  ,ButtonText );

Nun das Problem.
strcpy möchte einen Pointer auf das erste Element des Textes.
Ich habe jedoch nur die Adresse als "Klartext"

Wie kann ich hier nun einen Pointer erstellen ohne dieses hier:
1
char *Zeiger;
2
Zeiger = info->btn_text_addr;

Geht das direkt in einer Zeile?
Wie zb.
1
info->btn_text_addr*
 oder so?

von Peter II (Gast)


Lesenswert?

Claudio H. schrieb:
> Nun das Problem.
> strcpy möchte einen Pointer auf das erste Element des Textes.

dein Pointer zeigt doch auf die 1.freie stelle.
1
strcpy( info->btn_text_addr,ButtonText );

wenn das nicht geht, dann bitte die genaue Fehlermeldung posten.

von Sebastian V. (sebi_s)


Lesenswert?

Das was malloc zurück gibt ist doch schon die Addresse. Welchen Typ hat 
btn_text_addr? Das sollte als Typ char* haben.

von C. H. (hedie)


Lesenswert?

Peter II schrieb:
> Claudio H. schrieb:
>> Nun das Problem.
>> strcpy möchte einen Pointer auf das erste Element des Textes.
>
> dein Pointer zeigt doch auf die 1.freie stelle.
> strcpy( info->btn_text_addr,ButtonText );
>
> wenn das nicht geht, dann bitte die genaue Fehlermeldung posten.

Ich sehe hier das Problem in folgendem:
1
char *Zeiger;
2
3
//Zeiger ist ein Pointer. Dies erwartet strcpy.
4
5
//Strcpy wird ziemlich sicher folgendes tun: 
6
7
&Zeiger; //Damit bekommt es die Adresse im Speicher wo es die Daten ablegen muss. 
8
9
//Ich habe jedoch schon die Adresse.
10
//Wenn strcpy nun folgendes macht: 
11
12
&info->btn_text_addr;
13
14
//Dann erhält es die Adresse an welcher die Variable btn_text_addr liegt
15
//Es soll jedoch einfach direkt von hier:
16
info->btn_text_addr;
17
18
//Beginnen zu schreiben.

von C. H. (hedie)


Lesenswert?

Sebastian V. O. schrieb:
> btn_text_addr? Das sollte als Typ char* haben.

btn_text_addr ist uint32_t.

von Peter II (Gast)


Lesenswert?

Claudio H. schrieb:
> &Zeiger; //Damit bekommt es die Adresse im Speicher wo es die Daten
> ablegen muss.

nein, damit bekommt du die Adresse vom Pointer.

> btn_text_addr ist uint32_t.
warum willst du dann einen text dort reinschreiben?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Claudio H. schrieb:
> btn_text_addr ist uint32_t.

Ändere das zu char*. Oder verwende einen typecast, aber "sauber" ist das 
nicht (weil sizeof (pointer) nicht zwingend gleich sizeof (uint32_t) 
ist).

Außerdem sollte der Compiler bereits bei der Zuweisung des Ergebisses 
von malloc an Deinen uint32_t ungnädig sein; ignorierst Du hier die 
Warnung?

von Sebastian V. (sebi_s)


Lesenswert?

Claudio H. schrieb:
> &Zeiger; //Damit bekommt es die Adresse im Speicher wo es die Daten
> ablegen muss.

Nein das ist die Addresse im Speicher wo der Pointer liegt!

Claudio H. schrieb:
> btn_text_addr ist uint32_t.

Für Addressen gibt es extra einen Datentyp in C also sollte man den auch 
nutzen. In deinem Fall als char* Weil du eine Addresse/Pointer auf ein 
char hast.

von C. H. (hedie)


Lesenswert?

Peter II schrieb:
> Claudio H. schrieb:
>> &Zeiger; //Damit bekommt es die Adresse im Speicher wo es die Daten
>> ablegen muss.
>
> nein, damit bekommt du die Adresse vom Pointer.
>
>> btn_text_addr ist uint32_t.
> warum willst du dann einen text dort reinschreiben?

Ich möchte nicht den text in btn_text_addr schreiben
Der text soll an die Stelle, die mir malloc angibt geschrieben werden.
malloc gibt mir eine Adresse zurück.

Diese möchte ich abspeichern, damit ich später wieder weiss wo mein text 
liegt und
ich möchte strcpy mitteilen, es soll den text dorthin kopieren....

von Peter II (Gast)


Lesenswert?

Claudio H. schrieb:
> btn_text_addr ist uint32_t.

nachtrag.

wenn du malloc verwendest kommt ein Zeiger zurück, damit sollte man 
diese wert auch nur variablen zuweisen die ein Zeiger sind.

uint32_t ist kein Zeiger. Gibt es da keine Warnung?

von Peter II (Gast)


Lesenswert?

Claudio H. schrieb:
> Ich möchte nicht den text in btn_text_addr schreiben
> Der text soll an die Stelle, die mir malloc angibt geschrieben werden.
> malloc gibt mir eine Adresse zurück.

dann mach doch erst mal aus

btn_text_addr ein char*

dann passt das auch.

von C. H. (hedie)


Lesenswert?

Sebastian V. O. schrieb:
> Für Addressen gibt es extra einen Datentyp in C also sollte man den auch
> nutzen. In deinem Fall als char* Weil du eine Addresse/Pointer auf ein
> char hast.

Wie gross ist dann in diesem fall

btn_a

Peter II schrieb:
> Claudio H. schrieb:
>> Ich möchte nicht den text in btn_text_addr schreiben
>> Der text soll an die Stelle, die mir malloc angibt geschrieben werden.
>> malloc gibt mir eine Adresse zurück.
>
> dann mach doch erst mal aus
>
> btn_text_addr ein char*
>
> dann passt das auch.

Danke! Hat geklappt!

von Peter II (Gast)


Lesenswert?

Claudio H. schrieb:
> Sebastian V. O. schrieb:
>> Für Addressen gibt es extra einen Datentyp in C also sollte man den auch
>> nutzen. In deinem Fall als char* Weil du eine Addresse/Pointer auf ein
>> char hast.
>
> Wie gross ist dann in diesem fall

der Pointer ist auf 32bit Systemen 32bit groß, wohin er zeigt 
entscheidest du doch mit malloc wie viel Platz dort ist.

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.