地址0在HCS08上被NULL指针覆盖
题
在我的8位Freescale HCS08 Micro上,每当我调用库函数返回值的库函数时,我都会通过它,而我真的不想要它们,我都会扔进空中,例如
UART_SendBlock((char *)txstr, strlen(txstr), NULL);
最后一个参数的类型是 uint16_t *
并返回实际发送的字符数量,这是我不在乎的值。
但是,每次调用该功能时,我的微型港口A上都有问题,并且调试使我指出了这一论点使事情搞砸了。端口A的配置寄存器现场直播在地址0x0000和0x0001,这是 NULL
(又名 (void *)0
)积分。我想 NULL
它是某种程度上什么都不会做任何事情的魔术,但似乎并非如此。
我的解决方法真的很骇客:
#define MNUL (void *)(&mynull)
uint32_t mynull;
有更好的解决方案吗?我尝试将MNUL定义为我的处理器上未使用的内存段,但这会立即重置。
解决方案
除非UART_SENDBLOCK的文档指出将其传递给无效指针是可以的,否则您可能会得到未定义的行为 - 在这种情况下,似乎函数只是写入地址的函数,地址为0,它将在“未定义”下进行。行为”。
只需使用一个参数称呼它,就没有理由对此“聪明”。
uint16_t unused_16;
UART_SendBlock((char *)txstr, strlen(txstr), &unused_16);
如果您受到资源的限制,请进行 unused_16
全球并在其他地方重复使用
其他提示
该函数试图将值写入最后一个参数点的位置。您是通过null(0x0000)传递的,因此结果是写入内存位置0x0000或您的端口A。通常(通常编程)该函数会检查参数,而不会在位置上写入该位置。 null,但看来此功能并不遵循该约定。即使您不使用它,您也需要分配一个变量才能将其编写结果写入。
不隶属于 StackOverflow