C.中使用memcpy时的分段错误



我在代码中使用memcpy函数,运行时出现Segmentation Fault错误。

memcpy ((void *) ((unsigned int) core_data + (width * height * bpp)), (void *) core_data, (width * height * bpp));

core_data是无符号短指针,高度、宽度和bpp是static int类型。(宽度*高度*bpp)的值为8355840。当我把这个值减到10时,错误就解决了。但在实际情况下,我必须将值保持在8355840。有什么解决方案吗?

感谢

请显示更多代码。

您对强制转换的使用非常奇怪,而且其中有太多的括号,无法使其可读。您应该很少将指针强制转换为整数,如果这样做,则必须使用例如intptr_t来确保整数足够大以容纳指针值(unsigned int中的位数可能小于unsigned short *中的位数),否则指针在强制转换时会被破坏。

应该是:

memcpy(core_data + width * height * bpp, core_data, width * height * bpp);

C中的指针运算是一件(非常好的)事情,您不需要仅仅为了计算地址而对整数进行强制转换。请记住,指针算术是根据指向对象的大小"缩放"的,这可能意味着如果core_data是指向16位整数的指针,并且像素是16位,则bpp应该仅为1。

当然,还要确保内存分配正确,即:

core_data = malloc(2 * width * height * bpp * sizeof *core_data);

并使其返回非CCD_ 7。

当然,我们可以通过分解一个"帧"的大小来进一步提高代码的准确性:

const size_t frame_size = width * height * bpp;

然后我们可以在任何需要的地方使用它,让它更清楚地发生了什么:

core_data = malloc(2 * frame_size);

和:

memcpy(core_data + frame_size, core_data, frame_size);

相关内容

  • 没有找到相关文章

最新更新