我有这段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位寻址模式。
对此有任何提示吗?以及应该怎么做呢?预先感谢
答案 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