c++ - 当我尝试使用指针打印数组元素时打印垃圾值

标签 c++ arrays class object pointers

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

相关文章:

iphone - 有没有办法在 Objective-C 中合成类变量的 setter/getter?

c++ - 我经常在运算符重载定义中看到什么引用?

c - 将数组传递给方法时使用指针更改数组

c++ - 从用户获取字符串中的多个单词的代码

c++ - G++ 没有预期的编译错误。而是进行 "random"转换

c++ - 如何从 msi 安装中检索详细结果

php - 检查空值php时减少数组中foreach的使用

c - 为什么 printf 中不同的数组解引用会给出相同的输出?

python - Scala类是否具有像Python这样的“ self ”?

c++ - 如何调整非托管 C++ DLL 以供 Ruby 使用