首页 > 解决方案 > 当我尝试使用指针打印数组的元素时,会打印垃圾值

问题描述

我有一个名为 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++arraysclassobjectpointers

解决方案


该程序没有多大意义。

例如,可变长度数组不是标准的 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 

并且分配的内存将被释放。


推荐阅读