为什么显示“无效的类型转换”?

时间:2019-11-07 15:02:28

标签: c pointers types casting msp430

我有这段C代码(对于MSP430平台,cl430编译器):

void function(uint8_t * x){
    // This variable is defined in the linker file as "X_ADDR = 0xE000;"
    extern uint32_t X_ADDR; 
    uint16_t i = 0;
    uint16_t size = 10;
    uint32_t dst_addr = (uint32_t) &X_ADDR; 

    for (i=0; i < size; i++){
         *((uint8_t *) (dst_addr+i)) = *(x+i); // <-- This line shows the warning
}

我的理解是,但这是我猜错的地方:

*((uint8_t *) (dst_addr+i)) = *(x + i);
                |       |       |   |
                V       V       V   V
*((uint8_t *) (u32  + u16)) = *(u8*+u16);
       *((uint8_t *) (u32)) = *(u8*);
                     *(u8*) = u8;
                         u8 = u8;

此平台为16位,但支持扩展的20位寻址模式。

对此有任何提示吗?以及应该怎么做呢?预先感谢

3 个答案:

答案 0 :(得分:3)

您似乎在使用64位指针的64位编译器上获得了此功能。将32位整数转换为64位指针是有问题且不可移植的。

使用用于此目的的可移植整数类型更正此问题:

uintptr_t dst_addr = 0x00FFABCD; 

现在,它将在所有主流64位编译器上进行干净地编译。在-std=c11 -Wextra -Wall -pedantic-errors的gcc,clang icc上进行了尝试,没问题。

此外,访问绝对地址时,几乎肯定需要volatile限定指针。

答案 1 :(得分:0)

它反对将整数dst_addr转换为指针,而不是uint8_t的分配

$ gcc -c -Wall -W type.c
type.c: In function 'function':
type.c:11:12: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
          *((uint8_t *) (dst_addr+i)) = *(x+i); // <-- This line shows the warning
            ^

和clang提供类似的内容:

$ clang -c type.c -W -Wall
type.c:11:12: warning: cast to 'uint8_t *' (aka 'unsigned char *') from smaller integer type 'unsigned int'
      [-Wint-to-pointer-cast]
         *((uint8_t *) (dst_addr+i)) = *(x+i); // <-- This line shows the warning
           ^

(叮当声3.4.2; gcc 4.8.5)

总是怀疑从int转换为指针,而且我不确定是否有办法告诉编译器您的意思,至少是在打开所有警告的情况下(这是一种好习惯)。

答案 2 :(得分:0)

您正在将32位整数转换为16位指针。

为确保您的整数类型具有与指针相同的大小,请使用function getParameterizedPDOConnection($host = false, $overrideOptions = []) { include(INCLUDE_DIR . "/itrain.config.php"); $host = strtolower($_SERVER["HTTP_HOST"]); if (count($overrideOptions) > 0) { $configOptions["host"][$host] = $overrideOptions; } $sthUserName = $configOptions["userName"]; $pwd = $configOptions["pwd"]; $addr = $configOptions["host"][$host]["addr"]; $db = $configOptions["host"][$host]["db"]; try { $pdo = new PDO("sqlsrv:Server=$addr;Database=$db;ConnectionPooling=0", $sthUserName, $pwd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT)); return($pdo); } catch (PDOException $e) { return "Database connection failure: " . $e->getMessage(); } } 中的uintptr_t


当您将<stdint.h>视为字节数组时,最好这样声明:

X_ADDR