Pointer auf gespeicherte Adresse

#3976758
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?
#3976775
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.
Persönliche Seite #3976786
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?
#3976787
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.
#3976788
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....
#3976795
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!
Gast #3976798
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.

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