Aaalso, ich schreibe mal was dazu
Wenn man lokal (und nicht global) mit z.B.
Speicher reserviert, dann wird dieser Speicher auf dem Stack allokiert. D.h. du erhältst einen Pointer und dieser markiert die Anfangsadresse deines Char-Arrays. Wenn deine Funktion jetzt aber durchgelaufen ist, dann wird der Speicher automatisch wieder freigegeben. D.h. er kann und wird anderweitig wiederverwendet werden.
Das führt dann zu Folgendem: Du übergibst die Anfangadresse deines Char-Arrays an die Queue und aber kurz danach wird der Speicher freigegeben. Die Funktion rfidPreferenceLookupHandler() empfängt nun den Inhalt der Queue - einen Pointer. Und während sie damit arbeitet kann (muss nicht) es passieren, dass der Speicher ganz oder teilweise überschrieben wird. Der Pointer führt dann also zu einem Speicherbereich, der undefinierten Inhalt besitzt. Und dann knallt es eben.
Was kann man da machen? Ganz einfach: Man allokiert Speicher auf dem Heap. Damit reserviert man eine gewisse Größe an Speicher und erhält einen Pointer zurück, der die Anfangsstelle markiert. Vorteil: Der wird nicht überschrieben. Nachteil: Man ist selbst dafür verwantwortlich, ihn wieder freizugeben Tut man das nicht, dann ist der Speicher irgendwann entweder wegen Heap-Fragmentierung voll sein oder eben weil er wirklich voll ist Man spricht von einem Memory-Leak. Allerdings muss man hier die Taste vermutlich einigermaßen oft drücken, bis sich das mal auswirkt.
Heap-Speicher allokiert man üblicherweise mit malloc() oder calloc(). strdup() ist eine Komfortfunktion, die ich auch gerne verwende: Sie allokiert Speicher in der passenden String-Größe (n+1), gibt einen Pointer zurück und kümmert sich auch um die \0-Terminierung.
Begriffe:
\0-Terminierung: Char-Arrays müssen \0 terminiert sein, damit bei einem Char-Array klar ist, wo es endet. D.h. wenn man einen String mit zehn Zeichen hat, benötigt man 11 Zeichen Speicher.
Heap-Fragmentierung: Speicher muss immer zusammenhängend allokiert werden. Nehmen wir an, wir hätten 20 Zeichen Heap noch frei und müssten 15 Bytes allokieren. Wenn jetzt in der Mitte der 20 Bytes z.B. 2 Bytes allokiert wären, dann würde die Allokation fehlschlagen, weil das zusammenhängend nicht klappt. Und wenn man sich den Speicherbereich viel größer vorstellt mit lauter so kleinen bereits allokierten Blöcken, dann nennt man das Heap-Fragmentierung. D.h. obwohl eigentlich genug Speicher frei ist, klappt es dennoch nicht. Deswegen muss man eigentlich, wenn man das ganz ordentlich macht, auch prüfen, ob die Allokation wirklich geklappt hat (Pointer != NULL) Verlässt man sich einfach drauf, dass es geklappt hat, dann kann es zu komischen Effekten kommen
Hoffe das bringt Licht ins Dunkel