从不同大小的整数转换为指针
我正在尝试使用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 *
,那么不要强制转换类型。 不投射类型会给你警告,并且警告在许多情况下是未定义行为的指标。
JMP
或JMPSize
指针都不是值。 因此,当您将变量转换为指针时,memcpy将尝试从存储在JMP[0]
中的地址编号复制到存储在JMPSize
的地址编号。 这些内存位置可能无效,这会使程序出现段错误。
相反,你应该引用你的变量,这就是C中的&
运算符:
memcpy(&JMP[1], &JMPSize, 4);
链接地址: http://www.djcxy.com/p/28377.html