c++ - 在使用指针算术时为指针数组赋值给我错误
问题描述
当我做这个指针算术时,它总是给我一个错误
int main()
{
const int rowSize=40;
int* unique=nullptr;
int arr[rowSize]={1,1,11,31,21,22,2,2,3,32,31,3,4,34,45,5,55,5,55,5,6,46,64,6,7,27,74,7,7,7,7,11,11,11,11,11,1,2,13,4};
int amount=0;
for (int count=0; count<rowSize; count++)
{
if (arr[count]!=arr[count+1])
{
amount++;
}
}
unique= new int[amount];
for (int count=0; count<rowSize-1; count++)
{
if (arr[count]!=arr[count+1])
{
*unique=arr[count];
unique++;
}
}
for (int count=0; count<20; count++)
{
cout<<unique[count]<<" ";
}
cout<<endl;
delete [] unique;
unique=nullptr;
return 0;
}
每次我做这个指针算术,*unique=arr[count] 和 unique++,它总是在最后给我一个时髦的输出。
解决方案
更改new[]
操作符返回的指针的值是非常危险的,而且从来都不是编码的正确方法。这是因为,在某些时候,您需要通过delete[]
“调用”new[]
给您的地址来释放该内存。
在您的情况下,调用您的uniqueArr
函数的模块会获得一个返回值,该值将不再(在大多数情况下)是delete[]
调用的正确地址,并且会失败。
最好在指针上使用[]
运算符,使用适当时递增的索引值(当前递增指针的位置)。像这样的东西:
//...
int* unique = new int[amount];
size_t uIndex = 0;
for (int count=0; count<rowSize-1; count++)
{
if (arr[count]!=arr[count+1])
{
unique[uIndex] = arr[count]; // The [] works fine with a 'new[]' pointer!
uIndex++; // You could even include this POST-increment inside the [], above!
}
}
//... You can now 're-use' "unique" as it will still be the original address.
//...
这样,函数返回的值与new[]
操作符返回的值不变,对后续的任何操作都是有效的delete[]
。
随时要求进一步澄清和/或解释。
编辑:另一种方法(尽管恕我直言不好)方法是使用第二个int*
指针来保存 的值,然后在“重新使用”它之前unique
恢复到该值(在第二个循环中,或在调用之前)。unique
delete[]
推荐阅读
- angular - 如何为 Angular 项目编写 e2e 测试
- angular - Angular 组件模板继承
- firebase - 如何更改 Firebase 实时数据库位置?
- c# - 在 C# WPF 应用程序中使用 Firebase 身份验证
- angular - 如何在角度 SPA 路由中路由到容器应用程序
- sharepoint - SharePoint 2019 提供程序托管的加载项要求使用非 https SharePoint 的凭据
- html - 当我将鼠标悬停在它上面时,我的产品网格正在改变我的网站布局。我怎样才能改变这个?
- querydsl - QueryDSL 与千分尺的集成
- python - python脚本输入检查未运行脚本
- python-3.x - 如何使用 for 循环运行多个解析 python 代码?