如何阻止我的数组打印地址

How do I stop my array from printing address?

本文关键字:打印 地址 数组 我的 何阻止      更新时间:2023-10-16

我有一个标题,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() 打印出数组地址,而不是数组中包含的值。有没有办法解决这个问题?

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

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

你的问题在这里:

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();
}

您的代码未打印数组地址。 也许您看到了一些意外的数字并认为它是一个地址,但实际上这是由输出未初始化的变量引起的未定义行为。

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

也许你试过:

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

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

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

然后,建议的分配将起作用。

正如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];
    }
}

正如 M.M 还指出的那样,可以简单地将 Arr 中的私有变量中的int x[5]更改为 std::array<int, 5> x 然后在 setArr 中只需语句: x = {2, 3, 5, 7, 11};在我看来这是更好的选择,更容易阅读,但知道如何使用 C 数组 也很好