问题描述
在将值分配给所述动态内存时,在 C++ 中指向动态内存的指针上使用增量运算符是否无效?或者我在这里做错了什么?在我的网络搜索中的任何论坛中,我都找不到关于这个特定点的任何明确内容(主要是在 stackoverflow 中)。
我的这个版本的函数完美运行:
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;
}
打印出返回指针指向的动态内存内容的预期结果是:
[ 10,20,30,40,60,90,80,120,50,100,150 ]
但是当我尝试以下版本时,我遇到了段错误:
int* apply_all(const int* arr1,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,1041,741351515,539766816,824192048,741422128,858862647,825569589,891300917,909588787,909195318 ]
Segmentation fault (core dumped)
Process returned 139 (0x8B) execution time : 0.114 s"
这是来自 C++ 入门课程的作业,其中一项要求是编写一个具有 2 个 int 数组及其大小作为参数的函数。该函数是返回一个指向动态内存中数组的指针(由使用输入参数算术生成的值组成)。我在带有 GNU GCC 编译器(c++ 编译器:G++)和 GDB 的 linux mint 中使用代码块。但是我没有选择 C++ 的编译器标志,因为它们在选择时会导致问题,我在某处阅读(我相信这是一篇关于这里的帖子)通过不选择任何标志来解决问题。 (不确定这是否是一个因素。)
我也尝试过 *pArr++ 并得到相同的结果。这是C++的东西还是因为我的编译器或其他东西。我学习 C++ 的时间并不长,去年 10 月才开始学习用 C 编码,所以还有很多我仍然不知道的东西,可能对你们所有人来说都是基础。但我真的很想学习。提前致谢。如果您需要整个程序,请告诉我。我只是猜测这与问题无关。
解决方法
每当你增加一个指针时,你必须在返回之前保存一个副本,这也是对链表的一个建议,你访问每个后续节点但想要保存第一个节点的地址。所以在你的情况下:
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
}