C - 写入4个字节,但然后仅将指针增加3

时间:2017-02-13 12:08:45

标签: c pointers

我试图写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)

2 个答案:

答案 0 :(得分:4)

请记住,C11是一种编程语言,规范不是软件)也是如此。阅读n1570草案。

  

如何具体增加3,推荐的方法是什么?似乎使用(char *)演员可能是要走的路?

这很可能是一些undefined behavior(一般而言)。在某些计算机上,它可能“有效”(但非常缓慢,因为您进行了未对齐访问,请阅读data structure alignment)。你可以试试;

ptr = (uint32_t*)((char*)ptr + 3);

但你应该避免编码(这是一些丑陋的非portable代码,有难闻的气味)。在许多computer architecturesinstruction sets上,您可能会获得bus errorsegmentation 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)

  1. 如果您正在讨论字节,那么您应该使用字节或uint8_t类型而不是{{1} }。

  2. 看看你的类型我会说这个

    uint32_t

    非常错误。指针算术将向前移动指针uint32_t *ptr = (buffertowrite); ptr += 3; // but only move forward 3 bytes