如何阻止我的阵列打印地址?

时间:2016-06-09 01:13:49

标签: c++ arrays

我有一个标题,cpp和主要类。

//Arr.h
class Arr
{
public:
    void setArr();
    void printArr();
private:
    int x[5];
};

//Arr.cpp    
#include "Arr.h"
#include <iostream>

using namespace std;

void Arr::setArr()
{   
    int x[5] = { 2, 3, 5, 7, 11 };
}

void Arr::printArr()
{
    for (int i = 0; i < 5; i++)
    {
        cout << x[i] << "\n";
    }
}

//main.cpp
int main()
{
Arr a;
a.setArr();
a.printArr();
}

但是,当我运行代码时,a.printArr()会打印出数组地址,而不是数组中包含的值。有办法解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

您的代码将打印不是地址,但通过默认初始化生成一些不确定的值。初始化成员数组而不是本地数组要扔掉。

void Arr::setArr()
{
    x[0] = 2;
    x[1] = 3;
    x[2] = 5;
    x[3] = 7;
    x[4] = 11;
}

答案 1 :(得分:0)

你的问题在这里:

void Arr::setArr()
{   
    int x[5] = { 2, 3, 5, 7, 11 };
}

声明int x[5]定义了一个包含5个元素的新数组,这些元素将在退出该函数时被销毁;名称x隐藏了数据成员Arr::x

你能做到的一种方法是:

void Arr::setArr()
{   
    /*static*/ auto arr = { 2, 3, 5, 7, 11 };
    std::copy(arr.begin(), arr.end(), x);
}

完整代码:

#include <iostream>
#include <algorithm>

class Arr
{
public:
    void setArr();
    void printArr();
private:
    int x[5];
};

using namespace std;

void Arr::setArr()
{   
    /*static*/ auto arr = { 2, 3, 5, 7, 11 };
    std::copy(arr.begin(), arr.end(), x);
}

void Arr::printArr()
{
    for (int i = 0; i < 5; i++)
    {
        cout << x[i] << "\n";
    }
}

//main.cpp
int main()
{
Arr a;
a.setArr();
a.printArr();
}

答案 2 :(得分:0)

您的代码不是打印数组地址。也许你看到了一些意想不到的数字并假设它是一个地址,但实际上它是undefined behaviour输出未初始化的变量引起的。

您的代码int x[5] = ....失败,因为它声明了一个新的局部变量x,它不会修改类成员x

也许你试过了:

x = { 2, 3, 5, 7, 11 };

并出现编译错误。这是因为可能不会分配C样式的数组。这个恼人的规则是C ++过去的遗留问题。要避免此问题和许多其他问题,您可以尝试避免使用C样式数组。在这种情况下使用C ++数组:

private:
    std::array<int, 5> x;

然后建议的作业将有效。

答案 3 :(得分:0)

正如WhiZTiM已经指出的那样,你的问题出在你班级的setArr函数中。原因是因为在C ++中你无法以正常的方式将数值赋值给数组。即使用x = {blah, blah, blah};(除非您使用std::array<int, ARRAYSIZE>)。在setArr中,您正在创建另一个名为x的数组,然后一旦超出范围就删除该数组,并且在printArr中您正在打印一个没有值的数组。

数组中的每个值必须在C样式数组中单独设置(如MikeCAT的回答所示)。

对此的一个解决方案是创建一个包含所需值的临时数组,并通过for循环将值分配给类数组,即:

void Arr::setArr() {
    const int ARRAYSIZE = 5;
    int tmp[ARRAYSIZE] = {2, 3, 5, 7, 11};
    for (int i = 0; i < ARRAYSIZE; ++i) {
        x[i] = tmp[i];
    }
}

正如MM也指出的那样,只需将Arr中的私有变量中的int x[5]更改为std::array<int, 5> x,然后在setArr中只需要声明:x = {2, 3, 5, 7, 11};这是我的更好选择意见和更容易阅读,但知道如何使用C数组

也很好