2

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

2 回答 2

5

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

您需要使用 address-of 运算符&使它们成为指针:

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

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

于 2013-10-01T15:02:12.963 回答
1

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

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

memcpy(&JMP[1], &JMPSize, 4);
于 2013-10-01T15:03:29.853 回答