是否可以通过溢出C中的第一个元素来写入数组的第二个元素?

use*_*421 3 c c++ assembly nasm

在低级语言中,有可能mov是第一个数组元素的双字(32位),它将溢出写入第二个,第三个和第四个元素,或者mov一个字(16位)到第一个,它将溢出到第二个元件.

如何在c中实现同样的效果?当试图例如:

char txt[] = {0, 0};
txt[0] = 0x4142;
Run Code Online (Sandbox Code Playgroud)

它发出警告 [-Woverflow]

并且值txt[1] 不会改变txt[0]设置为0x42.

如何获得与汇编相同的行为:

mov word [txt], 0x4142

先前的汇编指令将设置在第一元件[txt+0]0x42第二元件[txt+1]0x41.

编辑

这个建议怎么样?

将数组定义为单个变量.

uint16_t txt;
txt = 0x4142;
Run Code Online (Sandbox Code Playgroud)

并使用((uint8_t*) &txt)[0]第一个元素和((uint8_t*) &txt)[1]第二个元素访问元素.

Att*_*son 8

如果您完全确定这不会导致分段错误,您必须使用memcpy()

uint16_t n = 0x4142;
memcpy((void *)txt, (void *)&n, sizeof(uint16_t));
Run Code Online (Sandbox Code Playgroud)

通过使用void指针,这是最通用的解决方案,可以推广到此示例之外的所有情况.

  • @MartinChekurov*不需要转换为void*鉴于问题也是(当前)标记为C++,它可能是. (6认同)