Statische und dynamische Stringarrays (Einfache Verständnisfrage)
-
Hi,
in einer Anwendung möchte ich MAC-Addressen speichern.
Zunächst hatte ich dafür __u8* vorgesehen. Es hat aber Vorteile auf __u8[6] umzusteigen, weil sizeof() dann die richtige Größe zurückliefert. Wenn ich richtig verstehe, sind beides zunächst Typen für Zeiger auf ein Zeichen (das erste eines Strings), oder ?Nun haben einige meiner Funktionen __u8** erwartet und diese Zeiger entsprechend verbogen (call-by-reference). Das klappt aber nicht mit __u8[6]. Warum nicht ?
typedef __u8[6] mac_t; __u8** p1; mac_t *p2; __u8* test = "123"; *p1 = test; // geht *p2 = test; // geht nicht - warum nicht ?
-
Ein __u8* ist ein Zeiger, der irgendwohin in den Speicher zeigen kann (daß man davon ausgeht, daß an der angegebenen Adresse ein Zeichen-Array beginnt, ist zwar eine übliche Konvention, aber keines wegs vorgeschrieben). __u8[6] ist ein Array von Zeichen - auch wenn das Array beim ersten Anzeichen einer Gefahr in einen Pointer zerfällt, ist das was völlig anderes.
Und bei einer Funktion, die einen __u8** (Zeiger auf einen __u8*) erwartet, gehe ich davon aus, daß sie selber genug Speicher anschaffen will und über den Parameter zurückgibt. Sowas geht nur mit echten Zeigern, nicht mit zerfallenen Arrays.
-
"Zerfallene Arrays" - hm - noch nie gehört. Jedenfalls erstmal vielen Dank für die schnelle Antwort, wenn ich sie auch leider nicht recht verstehe. Gerade eben bin ich auf die Idee gekommen, in den Funktionen mac_t** statt __u8** zu verwenden - und das scheint zu funktionieren.
Wenn ich in eine Funktion, die einen Eingabeparameter void** hat mit __u8** fülle, erhalte ich die gleiche Reaktion, als wenn ich mac_t** einsetze :
int get_cfgparam(int id, void** p); ... mac_t* ownmac; __u8* om; get_cfgparam(OWNMAC, &om); // geht get_cfgparam(OWNMAC, &ownmac); // geht auch
-
skpsequence schrieb:
"Zerfallene Arrays" - hm - noch nie gehört.
Das mußt du auch im Kontext des übrigen Beitrags sehen
Wenn ich in eine Funktion, die einen Eingabeparameter void** hat mit __u8** fülle, erhalte ich die gleiche Reaktion, als wenn ich mac_t** einsetze :
Darauf würde ich mich nicht unbedingt verlassen - __u8 und mac_t sind garantiert nicht gegeneinander austauschbar. (und wie gesagt, eine Funktion, die einen Doppelzeiger erwartet, kümmert sich in der Regel selber um die Beschaffung des nötigen Speichers)