我在我的代码中使用 memcpy 函数,当我运行它时出现了 Segmentation Fault 错误。以下是代码。
memcpy ((void *) ((unsigned int) core_data + (width * height * bpp)), (void *) core_data, (width * height * bpp));
core_data 是unsigned short 指针,height、width 和bpp 是static int 类型。 (width * height * 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 位的指针,则 bpp
应该只是 1整数,您的像素是 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);
关于c - 在 C 中使用 memcpy 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22090578/