【问题标题】:Code crashes in memcpy due to faulty pointer arithmetic由于错误的指针算法,memcpy 中的代码崩溃
【发布时间】:2019-12-16 10:44:22
【问题描述】:

由于某种原因,我无法理解循环中第二个memcpy 的以下代码崩溃(没有任何错误消息;gcc 7.4.0 Ubuntu 16.04,QT5)所以我猜我的指针算法是错误的,但是我不明白为什么:

#include <stdio.h>
#include <string.h>

#define ROWS 48
#define COLS 48
#define CHANNELS 3
#define NUM_PIX ((ROWS) * (COLS) * (CHANNELS))
struct MyImage
{
  int width;
  int height;
  int channels;
  unsigned char rawData[NUM_PIX];
};

int main()
{
  const int numIm = 16;
  MyImage theClsImArr[numIm];
  unsigned char ImArr[numIm][ROWS][COLS][CHANNELS];
  int Bytes2Copy = NUM_PIX * sizeof(unsigned char);
  for (int i = 0; i < numIm; i++ )
     memcpy(theClsImArr[i].rawData,ImArr + i * NUM_PIX ,Bytes2Copy ); // works when i = 0, crashes at i = 1

  return 0;
}

【问题讨论】:

  • 如果i * NUM_PIX &gt; CHANNELSImArr + i * NUM_PIX 是未定义的行为。
  • 旁注:sizeof(unsigned char) 始终为 1。此外,将大型数组存储为局部变量会导致堆栈溢出。
  • 另外:在 C++ 中,显示的可变长度数组是非标准的,仅作为扩展被某些编译器支持。
  • 这是 C 还是 C++ 问题?请仅使用相关语言进行标记
  • @ikegami No. const int,连同一个常量表达式初始化器,至少从 C++03 开始​​就是 C++ 中的有效编译时常量,可能更久。

标签: c++ pointers memcpy


【解决方案1】:

使用ImArr+i 代替ImArr + i * NUM_PIX。添加会自动考虑数组元素的大小,等于整个图像块。

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多