我试图写4个字节,但是然后只用3个字节递增指针,然后再写4个字节(覆盖最后一个字节),但我尝试过的所有东西都将ptr改为1或4我有一种感觉,即使我把它弄糊涂它可能不是最好的方法。如何具体增加3,推荐的方法是什么?似乎使用(char *)演员可能是要走的路?
uint32_t value = 0x00112233;
uint32_t *ptr = (buffertowrite);
*ptr = value; // write 4 bytes
ptr += 3; // but only move forward 3 bytes
*ptr = value; // write next 4 bytes (overwriting the last byte)
答案 0 :(得分:4)
请记住,C11是一种编程语言,规范(不是软件)也是如此。阅读n1570草案。
如何具体增加3,推荐的方法是什么?似乎使用(char *)演员可能是要走的路?
这很可能是一些undefined behavior(一般而言)。在某些计算机上,它可能“有效”(但非常缓慢,因为您进行了未对齐访问,请阅读data structure alignment)。你可以试试;
ptr = (uint32_t*)((char*)ptr + 3);
但你应该避免编码(这是一些丑陋的非portable代码,有难闻的气味)。在许多computer architectures或instruction sets上,您可能会获得bus error或segmentation fault。在某些未崩溃的计算机上,可能是non-atomic操作(如果代码为scheduled,您可能无法确定会发生什么,因此得到context switch或某些{{} 3}}里面)。另请阅读interrupt& sequence points
所以我建议不要那样编码,即使它在您的机器上显然有效(未来的pointer aliasing编译器可能会做不同的事情)。如果你需要编写这样的坏事,请务必至少在一些评论中添加一个大的警告。也许使用optimizing(或某些volatile
)。请务必检查发出的汇编程序代码(例如,使用gcc -O -fverbose-asm -S
)。
(一个不太难看的解决方案可能是逐字节复制)
花时间阅读atomic operations上的Lattner博客;你真的需要仔细阅读 。
(没有得到任何警告,并且得到一些显然工作代码,是最糟糕的未定义行为;你应该是What every C programmer should know about undefined behavior,而且你不够害怕! )功能
由于您正在考虑使用汇编程序中的某些代码,因此可以考虑使用asm
语句。阅读very scared。
答案 1 :(得分:-1)
如果您正在讨论字节,那么您应该使用字节或uint8_t
类型而不是{{1} }。
看看你的类型我会说这个
uint32_t
非常错误。指针算术将向前移动指针uint32_t *ptr = (buffertowrite);
ptr += 3; // but only move forward 3 bytes
。