2016-07-20 25 views
1

Nach Definition der Struktur in einem meiner Header-Datei definiert istTypecasting int in char *

typedef struct REMDEV_ADDR { 
UINT8 addr[DEVICE_ADDR_SIZE]; 
} RemDev_Addr; 

typedef RemDev_Addr BTDEV_ADDR; 

Jetzt habe ich Funktion nach, die ich verwenden möchte.

hci_acl_connect(UCHAR * bd_addr,UINT16 * handle); 

Also machte ich eine globale Instanz der obigen Struktur in meinem c-Datei

BTDEV_ADDR hsu_addr 

und die Funktion wie diese

Aufruf
hci_acl_connect((unsigned char *)&hsu_addr,&cont_hand); 

Ist eine Schublade gesteckt * correct „(unsigned char) & hsu_addr "?

+1

Wenn 'UCHAR' der gleiche Typ wie' UINT8' auf Ihrem Compiler + Plattform ist, dann ersetzen Sie '(unsigned char *) & hsu_addr' durch nur' hsu_addr.addr'. Ansonsten poste einen * viel * mehr Kontext. – dxiv

Antwort

1

Ja, natürlich. Ihre Variable befindet sich im Stapel, aber Sie müssen einen Zeiger angeben, so dass Sie &your_var verwenden. Sie benötigen einen Zeiger auf UCHAR, damit Sie: (UCHAR *)&your_var. Das Casting selbst ist in Ordnung, aber wir wissen nicht was UCHAR * bd_addr darstellen soll. Vielleicht sollten Sie stattdessen übergeben?

2

Angenommen, Sie möchten, dass die Funktion etwas mit dem Array addr in der Struktur ausführt, dann ist das Casting nicht erforderlich. Übergeben Sie einfach das addr Mitglied:

hci_acl_connect(hsu_addr.addr, &cont_hand); 

, dass beide ist vorausgesetzt, dass UINT8 und UCHAR sind beide Aliase unsigned char (die wie eine sichere Annahme scheint).

+0

aber hci_acl_connect (UCHAR * bd_addr, UINT16 * handle); Sein erstes Argument benötigt einen Char-Zeiger – Abhinav

+0

@Abhinav, sollten Sie wahrscheinlich aktualisieren Sie die Seite, um die neueste Bearbeitung dieser Antwort zu sehen – ForceBru

+0

@Abhinav Wenn z. "short" ist 8 Bits auf Ihrem System, ein 'unsigned char' scheint die einzige vernünftige Möglichkeit zu sein, sowohl' UINT8' als auch 'UCHAR' zu definieren, was bedeutet, dass beide Typen gleich sind. –

1

Gußstücke aus jedem anderen Zeigertyp auf ein char * oder unsigned char * ist sicher, weil char die am wenigsten strengen Ausrichtungsanforderungen hat, das heißt, es kann an jeder Adresse befinden. Es wird auch nicht die strenge Aliasing-Regel brechen.

Die Umkehrung ist jedoch undefiniertes Verhalten. Ein größerer Typ wird normalerweise strengere Ausrichtungsanforderungen haben und dies wird möglicherweise zu einem Versuch führen, eine Operation an einer fehlausgerichteten Adresse durchzuführen. Der neue Zeiger könnte möglicherweise auch den alten aliasieren und dies würde möglicherweise den Compiler bei der Durchführung von Optimierungen in die Irre führen.