从不同大小的整数转换为指针

我正在尝试使用memcpy,但它给了我一个

运行时错误:分段错误(核心转储)

和一个编译器警告:警告:从不同大小的整数转换为指针[-Wint-to-pointer-cast]

这是代码

unsigned char JMP[6] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3};
unsigned long JMPSize = ...;

//copy jump size to jump instruction at second byte (this is where i get the error)
memcpy((uint8_t*)JMP[1],(void*)JMPSize, 4);

JMP[1]JMPSize是指针。 这意味着memcpy会将变量的实际值解释为指针,然后它会指向某处并导致未定义的行为。

您需要使用地址运算符& ,使它们的指示:

memcpy(&JMP[1], &JMPSize, 4);

通常,如果一个函数接受一个void *参数,或者返回void * ,那么不要强制转换类型。 不投射类型会给你警告,并且警告在许多情况下是未定义行为的指标。


JMPJMPSize指针都不是值。 因此,当您将变量转换为指针时,memcpy将尝试从存储在JMP[0]中的地址编号复制到存储在JMPSize的地址编号。 这些内存位置可能无效,这会使程序出现段错误。

相反,你应该引用你的变量,这就是C中的&运算符:

memcpy(&JMP[1], &JMPSize, 4);
链接地址: http://www.djcxy.com/p/28377.html

上一篇: cast to pointer from integer of different size

下一篇: How to cast an integer to void pointer?