C++ 在指向动态内存的指针上使用增量运算符

C++ Using the increment operator on a pointer to dynamic memory

在将值分配给所述动态内存时,在 C++ 中对指向动态内存的指针使用递增运算符是否无效?或者我在这里做错了什么?我无法在我的网络搜索中的任何论坛中找到关于这个特定点的任何明确信息(主要是在 Whosebug 中)。

我的函数的这个版本完美运行:

int* apply_all(const int* arr1 , size_t arr1_size, const int* arr2 , size_t arr2_size)
{
   int it {};
   int* pArr = new int[arr1_size * arr2_size];
   for(size_t i {}; i < arr1_size; ++i)
      for(size_t j {}; j < arr2_size; ++j)
         pArr[it++] = arr1[i]*arr2[j]; // <-- This works perfectly!
   return pArr;
}

打印出returned指针指向的动态内存内容的预期结果是:

[ 10, 20, 30, 20, 40, 60, 30, 60, 90, 40, 80, 120, 50, 100, 150 ]

但是当我尝试以下版本时出现段错误:

int* apply_all(const int* arr1 , size_t arr1_size, const int* arr2 , size_t arr2_size)
{
   int* pArr = new int[arr1_size * arr2_size];
   for(size_t i {}; i < arr1_size; ++i)
      for(size_t j {}; j < arr2_size; ++j)
         *(pArr++) = arr1[i]*arr2[j]; // <-- This does not work!!
   return pArr;
}

以上导致此输出:

"[ 0, 0, 0, 1041, 0, 741351515, 539766816, 824192048, 741422128, 539766816, 858862647, 825569589, 891300917, 909588787, 909195318 ]

Segmentation fault (core dumped)

Process returned 139 (0x8B)   execution time : 0.114 s"

这是来自 C++ 入门课程的作业,其中要求之一是编写一个函数,其中包含 2 个 int 数组及其大小作为参数。该函数是 return 指向动态内存中数组的指针(由使用输入参数算术生成的值组成)。我在 linux mint 中使用代码块与 GNU GCC 编译器(c++ 编译器:G++)和 GDB。但是我没有选择 C++ 的编译器标志,因为它们在选择时会导致问题,我在某处阅读(我相信这是一个 post 在这里)通过不选择任何标志来解决问题。 (不确定这是否是一个因素。)

我也试过*pArr++,得到了同样的结果。这是 C++ 的问题还是因为我的编译器或其他原因。我学习 C++ 的时间并不长,去年 10 月才开始学习用 C 编写代码,所以还有很多我不知道的地方可能对你们来说都是基础的。但我真的很想学习。提前致谢。如果您需要整个程序,请告诉我。我只是猜测这与问题无关。

每当你递增一个指针时,你必须在你 return 它之前保存一个副本,这也是对链表的建议,在链表中你访问每个后续节点但想要保存第一个节点的地址。所以在你的情况下:

int* apply_all(const int* arr1 , size_t arr1_size, const int* arr2 , size_t arr2_size)
{
   int* pArr = new int[arr1_size * arr2_size];
   Int* tmp = pArr; // you store pointer of pArr in tmp, it will not be incremented.
   for(size_t i {}; i < arr1_size; ++i)
      for(size_t j {}; j < arr2_size; ++j)
         *(pArr++) = arr1[i]*arr2[j]; // <-- This does not work!!
   return tmp; // you return tmp which point at the address of pArr where the first item is located
}