Ich habe über ein Stück Code kam die folgende Initialisierung macht:String initializer mit geschweiften Klammern
static const uint8_t s[] = {"Some string"};
Ich würde erwarten, dass es zu interpretieren, wie folgt: Die rechte Seite ist ein Array von char Zeiger mit einzelnen passend Element, das auf ein String-Literal "Some string" zeigt. Während der linke Teil ein Array von uint8_t
ist. Dann erwarte ich, dass das erste Element von s
einen abgeschnittenen Wert des Zeigers auf das Zeichenfolgenliteral erhält, was zu einem unerwarteten Verhalten im folgenden Code führt, unter der Annahme, dass s
eine Zeichenfolge ist.
Ich habe den folgenden Testcode gemacht:
#include <stdint.h>
#include <stdio.h>
static const uint8_t s1[] = "String1";
static const uint8_t s2[] = { "String2" };
int main(void){
printf("%p, %p\n", s1, s2);
printf("%s, %s\n", s1, s2);
return 0;
}
Für meine Überraschung scheint es, dass es nicht geschieht. Nicht nur der Code wird richtig funktionieren, sondern auch die Demontage zeigt, dass sowohl s1
als auch s2
als die entsprechenden Strings in identischer Weise initialisiert werden.
Ist das etwas gcc
spezifisch? Ist es C-Syntax erlaubt, das einzelne String-Literal in {}
zu nehmen und es trotzdem als String-Literal zu interpretieren?
Fügen Sie eine zweite Zeichenfolge hinzu, und sehen Sie, was passiert: 'static const uint8_t s2 [] = {" String2 "," String3 "};' – LPs
@LPs Ja, habe es versucht. –
Ok, DevSolar hat dir gegeben, was du brauchst. – LPs