You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中实现类似汇编的数组首元素溢出跨元素写入?

如何在C语言中实现汇编mov word [txt], 0x4142的内存写入效果

你提到汇编里能用mov指令直接跨元素写入内存,但C语言直接赋值char txt[] = {0, 0}; txt[0] = 0x4142;会触发溢出警告,还只保留低字节,没法覆盖多个元素。下面给你两种靠谱的实现思路,以及分析你提到的uint16_t变量方案的可行性:

方法一:指针类型转换直接写入16位值

你可以把字符数组的地址强制转换成uint16_t*类型,直接给这个指针赋值,就能一次性覆盖两个char元素,完全复刻汇编指令的效果:

#include <stdint.h>

char txt[] = {0, 0};
*(uint16_t*)txt = 0x4142;

在小端序(绝大多数现代CPU的字节序)环境下,0x4142会被拆分为低字节0x42存在txt[0],高字节0x41存在txt[1],和汇编mov word [txt], 0x4142的行为完全一致。

需要注意两个细节:

  • 确保数组长度足够,比如这里txt至少要有2个char元素,否则会触发越界访问,导致未定义行为
  • 如果是大端序环境,字节顺序会反过来(txt[0]是0x41,txt[1]是0x42),如果需要严格匹配特定字节顺序,要提前考虑系统的字节序差异

方法二:使用联合(Union)实现内存共享

另一种更符合C语言类型安全规范的方式是用联合类型,它允许不同数据类型共享同一块内存空间:

#include <stdint.h>

union CharWord {
    char bytes[2];
    uint16_t word;
};

union CharWord txt = {.bytes = {0, 0}};
txt.word = 0x4142;

给txt.word赋值后,txt.bytes[0]和txt.bytes[1]会自动根据字节序填充对应字节,效果和汇编指令一致。这种方式不需要指针强制转换,代码可读性和安全性更高。


关于uint16_t txt;加指针转换的方案是否可行?

完全可行!这种思路本质上和方法一类似,通过把16位变量的地址转换成8位指针,直接访问它的单个字节:

#include <stdint.h>

uint16_t txt = 0x4142;
char byte0 = ((uint8_t*)&txt)[0]; // 小端序下值为0x42
char byte1 = ((uint8_t*)&txt)[1]; // 小端序下值为0x41

你也可以通过这种方式修改单个字节:

((uint8_t*)&txt)[0] = 0x43; // 修改低字节为0x43

只要你访问的索引不超过uint16_t的内存范围(也就是0和1),就不会有问题。同样要注意字节序的差异,不同系统下字节存储顺序可能不同。

内容的提问来源于stack exchange,提问作者user37421

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:20:32