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

标签 c segmentation-fault memcpy

我在我的代码中使用 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/

相关文章:

python - Cython:如何从 C 级类型获取 'actual Python type'(类型代码/dtype)

c - 为什么我的递归程序会出现段错误?

C++ char数组复制到unsigned char数组

c - C 中的字符串结构变量赋值错误

c - 如何将数字插入到 C 中的二叉搜索树中?

c - 读取文件时出现段错误

CUDA 设备到主机数据传输错误

c++ - 在带有 union 的类中使用 'memcpy()'

c - 警告 : array subscript is above array bounds [-Warray-bounds] in module

c - 什么是?? () 中的段错误是什么意思?