我正在尝试使用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);
答案 0 :(得分:5)
JMP[1]
和JMPSize
都不是指针。这意味着memcpy
会将变量的实际值解释为指针,然后指向某处,导致未定义的行为。
您需要使用address-of运算符&
来指定它们:
memcpy(&JMP[1], &JMPSize, 4);
通常,如果函数采用void *
参数或返回void *
,则不转换类型。不投射类型将为您提供警告,并且警告在许多情况下是未定义行为的指示符。
答案 1 :(得分:1)
JMP
或JMPSize
指针都不是值。因此,当您将变量转换为指针时,memcpy将尝试从存储在JMP[0]
中的地址编号复制到存储在JMPSize
中的地址编号。这些内存位置可能无效,这会使您的程序出现段错误。
相反,您应该引用您的变量,即C中&
运算符的用途:
memcpy(&JMP[1], &JMPSize, 4);