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

标签 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)

最佳答案

记住 C11是一种编程语言,也是一种规范(它不是软件)。阅读n1570草稿。

How to specifically increment by 3, and what is the recommended approach? It seems that using a (char *) cast might be the way to go?

这很可能是一些 undefined behavior (一般来说)。在某些计算机上,它可能会“工作”(但速度非常慢,因为您进行了未对齐的访问,请阅读 data structure alignment )。你可以试试;

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

但是你应该避免这样的编码(这是一些丑陋的非portable代码,有难闻的气味)。关于很多computer architecturesinstruction sets , 你很可能会得到一个 bus errorsegmentation fault .在一些没有崩溃的计算机上,它可能是一个 non-atomic操作(你可能不确定如果代码是 scheduled 会发生什么,所以里面有一个 context switch 或一些 interrupt)。另请阅读 sequence points & pointer aliasing .

所以我建议不要那样编码,即使它碰巧在你的机器上显然可以工作( future 的 optimizing 编译器可能会做不同的事情)。如果您需要编写此类糟糕的代码,请确保至少在某些注释中添加一个大警告。也许使用 volatile (或一些 atomic operations )。请务必检查发出的汇编代码(例如使用 gcc -O -fverbose-asm -S)。

(一个不太难看的解决方案可能是逐字节复制)

花时间阅读 Lattner 在 What every C programmer should know about undefined behavior 上的博客;你真的需要仔细阅读

(没有收到任何警告,并得到一些显然有效的代码,是最糟糕的未定义行为;你应该是 very scared,你还不够害怕!)

由于您是从汇编程序中的一段代码开始思考,您可能会考虑使用 asm 语句。阅读Using Assembly Language with C .

关于C - 写入 4 个字节,但随后仅将指针递增 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42203681/

相关文章:

c - 指向指针的指针在树复制算法中不起作用

c - 创建 makefile 会导致 "expected ‘;’ 标记之前出现错误 ‘,’ 、 ‘)’ 或 ‘*’ ”

c - 串行通信 C/C++ Linux 线程安全吗?

c - 使用结构将内存分配给结构

当我尝试复制一个字符串时,Android NDK strcpy 崩溃

c++ - 指向可能存在或不存在的对象的指针 vector

c++ - 将带有指针的 std 列表复制到另一个带有指针的 std 列表

C - 传递 json_t (jansson lib) 作为参数(指针)

c - 是否有 libc 函数(或等效函数)可以知道堆的当前大小?

c++ - 锁定文件并避免同一进程访问它两次