error wide character array initialized from non-wide string
这个错误的本质应该是因为用uint16_t去初始化string导致的
即在C语言string如果定义如下:
uint8_t string_test[]= "Hello World";
char string_test[]= "Hello World";
都是可以的,因为实际上char和uint8_t是一样的。同时,定义成如下也可以:
uint8_t string_test[] = {'H','e','l','l','o',' ','W','o','r','l','d'};
但是如下是不可以的:
uint16_t string_test[] = "Hello World";
系统会报错
error: wide character array initialized from non-wide string
Clion会提示
Array Initialize must be an initialize array
但是,
uint16_t string_test[] = {'H','e','l','l','o',' ','W','o','r','l','d'};
是可以的。
这里很明显用uint16_t去初始化双引号的string是不可以的。
猜测原因是如果使用双引号初始化string,系统分配地址是按char的大小来分配的,即一个字节,但是uint16_t占两个字节,所以系统报错。后面之所以可以,是因为'H'
相当于16进制的0x48,因此本质上uint16_t string_test[] = {'H','e','l','l','o',' ','W','o','r','l','d'}
是等于uint16_t string_test[] = {0x48,0x65,0x6C,0x6C,0x6F,0x20,0x57,0x6F,0x72,0x6C,0x64}
,是按数组的方式初始化的。所以空间可以按两个字节分配。这里用uint8_t string_test[] = {0x48,0x65,0x6C,0x6C,0x6F,0x20,0x57,0x6F,0x72,0x6C,0x64}
也没有问题。同时在用char去打印数值的时候,不管数值是uint16_t还是uint8_t,都是会打印对应Ascii码的。
即
printf("%c",'H');
printf("%c",0x48);
都会输出H.