c++ - 当我尝试使用指针打印数组的元素时,会打印垃圾值
问题描述
我有一个名为 mvector 的类,它有两个私有变量 num(表示数组中元素的数量)和一个用于存储数组地址的整数指针。mvector 有 2 个公共函数 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
被分配了一个本地数组的第一个元素的地址,该数组在退出成员函数后将不再存在。因此,在成员函数中使用 this 指针会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
并且分配的内存将被释放。
推荐阅读
- bash - 使用脚本从文件中提取日期和 LUFS
- reactjs - 具有自定义组件的材料 ui 文本字段和 Formik 表单
- javascript - 仅在重新加载页面后才在生产中加载字体-React js,情感
- java - 为什么我的方法看似自动递增?
- java - 如何将@JsonManagedReference 和@JsonBackReference 用于与最佳实践的多对多关系?
- c - 在运行时强制转换 void 指针
- kotlin - Kotlin 没有从绑定的 viewModel 中获取数据
- excel - 行的条件格式
- ruby-on-rails - Rails s3:根据模型的ID在特定路径中上传对象
- javascript - Svelte,Storybook 无法解析自定义别名