【问题标题】:Segmentation Fault while using memcpy in C在 C 中使用 memcpy 时出现分段错误
【发布时间】:2014-02-28 09:05:06
【问题描述】:

我在我的代码中使用 memcpy 函数并在运行它时出现分段错误错误。下面是代码。

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

core_data 是 unsigned short 指针,高度、宽度和 bpp 是 static int 类型。 (width * height * bpp) 的值为8355840。当我减小这个值时,比如 10,错误就解决了。但在实际情况下,我必须将值保持为 8355840。 有什么解决办法吗?

谢谢

【问题讨论】:

  • 在复制到core_data 之前,您是否已将内存分配给core_data,或者至少将其初始化为指向已分配的内存?
  • 请问bpp 是什么类型?
  • 为什么要投到(unsigned int)
  • @alk,不,我没有为 core_data 分配任何内存!
  • bpp 是静态 int 类型

标签: c segmentation-fault memcpy


【解决方案1】:

请显示更多代码。

您对强制转换的使用非常奇怪,而且括号太多,难以阅读。你应该很少将指针转换为整数,如果你这样做,你必须使用例如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);

并让它返回非NULL

当然,我们可以通过分解一个“框架”的大小来进一步提高这段代码的美观度:

const size_t frame_size = width * height * bpp;

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

core_data = malloc(2 * frame_size);

和:

memcpy(core_data + frame_size, core_data, frame_size);

【讨论】:

  • 在这种情况下 bpp 是 4,而不是 1。
  • @Sid 但是bpp 是什么意思?是“每像素字节数”吗?如果是这样,那么core_data 指针应该是uint8_t *。否则,如果像素是 32 位的,为什么不将 core_data 变成 uint32_t * 并删除 bpp
  • +1 - 演员阵容太奇怪了,我什至没有停下来思考指针算法的用途:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 2021-06-13
  • 2013-04-03
  • 2016-09-15
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多