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

时间:2013-10-01 14:59:51

标签: c linux pointers

我正在尝试使用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);

2 个答案:

答案 0 :(得分:5)

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

您需要使用address-of运算符&来指定它们:

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

通常,如果函数采用void *参数或返回void *,则转换类型。不投射类型将为您提供警告,并且警告在许多情况下是未定义行为的指示符。

答案 1 :(得分:1)

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

相反,您应该引用您的变量,即C中&运算符的用途:

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