初始化中的指针目标的签名不同

时间:2019-01-12 09:19:50

标签: c

这是我的代码,我在初始化时收到警告指针目标,其签名不同。有人可以帮我吗

 const uint8_t *activity_output[4] = {"B_STILL", "B_WALk", "B_RUN", "B_UNKNOWN"};

1 个答案:

答案 0 :(得分:0)

string literal(例如"a string")的类型为char[N]。在您的计算机上,charsigned char。这意味着"B_STILL"实际上是(signed char[]){"B_STILL"}signed char个字节的数组。

uint8_t(通常)是unsigned char的typedef,并且是无符号类型。

因此,当您从uint8_t *字符串文字中初始化"B_STILL"指针时,您将转换char*指针(C中的数组自动衰减为要键入的指针,即char[N]衰减到char*指针)变成uint8_t *指针。因此,编译器会警告您-您将signed char*指针转换为unsigned char*指针,它们的唯一性不同。

可能的解决方法:

  1. 移至char。由于activity_output是一个字符串数组(即char[]),因此可以期望它具有char*[]类型,即。指向字符串的指针数组。那时您的意图会很清楚。如果您稍后将其与printf("%s". ...)一起使用,便是这种方式。

    const char *activity_output[4] = {
        "B_STILL",
        "B_WALk", 
        "B_RUN", 
        "B_UNKNOWN"
    };
    
  2. 显式删除指针。

    const uint8_t *activity_output[4] = {
        (uint8_t*)"B_STILL",
        (uint8_t*)"B_WALk", 
        (uint8_t*)"B_RUN", 
        (uint8_t*)"B_UNKNOWN"
    };
    
  3. 使用compound literals

    const uint8_t *activity_output[4] = {
        (uint8_t[]){"B_STILL"},
        (uint8_t[]){"B_WALk"}, 
        (uint8_t[]){"B_RUN"}, 
        (uint8_t[]){"B_UNKNOWN"}
    };