返回一个带有指针C++的数组
returning an array with a pointer C++
im试图创建一个函数,该函数将一个数组作为参数,并使一个新数组变大一个元素,并使新数组的下一个元素成为第一个数组的当前元素(到的数组1{1,2,3,4,5}将变为{0,1,2,3,4,5}),我使该部分工作正常,但该函数必须返回一个指向新数组的指针并显示该数组。我一直在玩指针,我可以让它处理普通的int变量,但不能处理这个数组,它一直显示垃圾。有人知道我做错了什么吗?
#include "stdafx.h"
#include <iostream>
using namespace std;
int *newaray(int[], int);
int main()
{
int *numbers;
int i;
int ar1[] = {1,2,3,4,5};
numbers = newaray(ar1, 5);
for (i = 0; i <= 5; i++)
{
cout << numbers[i] << endl;
}
//cout << numbers << endl;
system("pause");
return 0;
}
int *newaray ( int array[],int size)
{
int ar2[] = {0,0,0,0,0,0};
int i;
int *ptr;
ptr = ar2;
for ( i = 0; i <= size; i ++)
{
ar2[i + 1] = array[i];
}
//for (i = 0; i <= size; i++)
//{
// cout << ar2[i] << endl;
//}
return ptr;
}
您需要使用动态内存分配,否则当函数堆栈弹出时,您的数组就会消失。当然,在完成它之后,请记住delete
,这样就不会泄露内存。
#include <iostream>
#include <string.h>
using namespace std;
int *newaray(int[], int);
int main()
{
int *numbers;
int i;
int ar1[] = {1,2,3,4,5};
numbers = newaray(ar1, 5);
for (i = 0; i < 6; i++)
cout << numbers[i] << endl;
// Clean up after ourselves.
delete[] numbers;
return 0;
}
int *newaray ( int array[],int size)
{
// Allocate new memory on the heap to store the return value.
int *ar2 = new int[size + 1];
memset(ar2, 0, (size +1)*sizeof(int));
for (int i = 0; i < size; i++)
ar2[i + 1] = array[i];
return ar2;
}
您必须使用new运算符动态分配数组。
请参阅下面的代码。
int *newaray ( int array[], int size)
{
int i;
int *ar2=new int[size+1]; // note size+1
ar2[0]=0;
for ( i = 0; i < size; i ++) // no equal to operator
{
ar2[i + 1] = array[i];
}
return ar2;
}
总的来说,释放分配给阵列的内存:
delete[] numbers;
return 0;
}
函数返回int *
是一种糟糕的风格。这是因为它让调用者有责任担心内存管理。
最好将数组放置在管理自己内存的容器中。幸运的是,在标准C++中有很多这样的容器,最简单的是std::vector
,它可以容纳可变大小的数组。(还有std::array
,但只有在编译时已知大小的情况下才有效)。
std::vector<int> new_array( int array[], int size )
{
std::vector<int> vec( array, array + size );
vec.insert( vec.begin(), 0 );
return vec;
}
然后在main
:中
std::vector<int> numbers = new_array(arr1, 5);
for (i = 0; i < numbers.size(); i++)
cout << numbers[i] << endl;
这段代码几乎相当于其他海报所建议的"隐藏"代码,只是在这个版本中,您不必担心内存管理及其相关问题。
数组在堆栈上,一旦函数返回,数组就会超出作用域。您返回的指针无效。
在您的上下文中(尝试创建新的数组),您可能需要动态分配数组(并记住在完成后删除它们)
您正在返回一个指向数组的指针,该数组在从函数返回时被删除。main
中的指针指向已删除的内存,因此您会看到垃圾。您需要从堆中分配内存,并返回一个指针—从堆中所分配的内存。
int *newaray ( int array[],int size)
{
int* ptr = new int[size+1];
for ( int i = 0; i <= size; i ++)
{
ptr[i + 1] = array[i];
}
return ptr;
}
在main
中,确保取消分配内存。
numbers = newaray(ar1, 5);
for (i = 0; i <= 5; i++)
{
cout << numbers[i] << endl;
}
delete [] numbers;
这里有一个额外的版本,它使用了更多的C++概念(需要C++11)。IMO这类任务比复杂的输入解析更适合学习语言。
#include <vector>
#include <iostream>
template<typename T, size_t size>
std::vector<T> new_array(T (&array)[size] )
{
std::vector<T> vec( array, array + size );
vec.insert( vec.begin(), T() );
return vec;
}
int main()
{
int ar1[] = { 1, 2, 3, 4, 5 };
auto numbers = new_array(ar1);
for ( auto num : numbers )
std::cout << num << std::endl;
}
在这个版本中,您可以用double
、std::string
或任何class
数组替换int ar1[]
,其他一切都可以保持不变!
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错