我在代码中使用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);