我有一个名为 mvector 的类,它有两个私有(private)变量 num(表示数组中的元素数)和一个用于存储数组地址的整数指针。 mvector 有 2 个公共(public)函数,get() 和 print() 来获取数组的元素,并(分别)打印它们。 但是,当我尝试打印这些值时,一些值是正确的,而另一些则是垃圾值。
#include<iostream>
using namespace std;
class mvector
{
private:
int num;
int *ele;
public:
void get();
void print();
};
void mvector::get()
{
cin>>num;
int data[num];
for(int i=0; i<num; i++)
{
cin>>data[i];
}
ele=data;
}
void mvector::print()
{
for(int i=0; i<num; i++)
{
cout<<*ele<<endl;
ele++;
}
}
int main()
{
mvector v1;
v1.get();
v1.print();
}
Input: 5 1 2 3 4 5
Expected Output: 1 2 3 4 5
Actual Output: 1 1 1877615960 4 5
最佳答案
这个程序没有什么意义。
例如可变长度数组不是标准的 C++ 特性。所以数组的声明
cin>>num;
int data[num];
不正确。
在函数 get
中,数据成员 ele
被分配了一个局部数组的第一个元素的地址,该数组在退出成员函数后将不再存在。所以在成员函数 print
中使用这个指针会调用未定义的行为。
您必须动态定义数组。
此外,在函数 print
中,指针 ele
递增并失去其初始值。这意味着您可以第二次调用该函数
您应该定义一个具有构造函数和析构函数的类。
或多或少的工作代码可以如下所示。
#include <iostream>
class mvector
{
private:
size_t num = 0;
int *ele = nullptr;
public:
void get();
void print() const;
};
void mvector::get()
{
size_t n;
std::cin >> n;
if ( n != num )
{
delete [] ele;
ele = nullptr;
if ( n != 0 )
{
ele = new int[n];
}
num = n;
}
if ( num != 0 )
{
for ( size_t i = 0; i < num; i++)
{
std::cin >> ele[i];
}
}
}
void mvector::print() const
{
int *p = ele;
for ( size_t i = 0; i < num; i++ )
{
std::cout << *p << ' ';
++p;
}
std::cout << '\n';
}
int main()
{
mvector v1;
v1.get();
v1.print();
v1.get();
}
对于这样的输入
5
1 2 3 4 5
0
输出将是
1 2 3 4 5
并且分配的内存将被释放。
关于c++ - 当我尝试使用指针打印数组元素时打印垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893456/