在C中使用memcpy时出现分段错误

时间:2014-02-28 09:05:07

标签: c segmentation-fault memcpy

我在我的代码中使用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。 任何解决方案?

谢谢

1 个答案:

答案 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);