我在我的代码中使用memcpy函数,并在运行时遇到Segmentation Fault错误。以下是代码。
memcpy ((void *) ((unsigned int) core_data + (width * height * bpp)), (void *) core_data, (width * height * bpp));
core_data是无符号短指针,高度,宽度和bpp是 static int 类型。 (width * height * bpp)的值为 8355840 。当我减小这个值,比如10时,错误就解决了。但在实际情况下,我必须将值保持为8355840。 任何解决方案?
谢谢
答案 0 :(得分:3)
请显示更多代码。
你使用强制转换非常奇怪,并且那里有太多括号使其可读。你应该很少将指针转换为整数,如果你这样做,你必须使用例如intptr_t
以确保整数足够大以容纳指针值(unsigned int
中的位数可能小于unsigned short *
中的位数),否则指针是在施法时被摧毁。
应该是:
memcpy(core_data + width * height * bpp, core_data, width * height * bpp);
C中的指针算法是一个(非常好的),你不需要为了计算地址而转换为/从整数转换。请记住,指针算法是由指向对象的大小“缩放”的,这可能意味着bpp
只应为1,如果core_data
是指向16位整数的指针且像素为16位。
当然,还要确保正确分配内存,即:
core_data = malloc(2 * width * height * bpp * sizeof *core_data);
并让它返回非NULL
。
当然,我们可以通过分解一个“帧”的大小来进一步提升这段代码的优点:
const size_t frame_size = width * height * bpp;
然后我们可以在需要的地方使用它,以便更清楚地了解正在发生的事情:
core_data = malloc(2 * frame_size);
和
memcpy(core_data + frame_size, core_data, frame_size);