为啥这个数组的第 0 个索引仍然不等于 0?

Posted

技术标签:

【中文标题】为啥这个数组的第 0 个索引仍然不等于 0?【英文标题】:Why doesn't the 0th index of this array still equal 0?为什么这个数组的第 0 个索引仍然不等于 0? 【发布时间】:2018-12-08 04:44:49 【问题描述】:

在下面的代码中,to_string(foo1->_bar[0]) 行返回"0",正如人们所期望的那样。但是,to_string(foo2->_bar[0]) 行返回一些其他(看似随机的)整数。为什么是这样?我该怎么做才能使我的代码以预期的方式运行? (即,导致Foo 的默认构造函数将等于0 的整数数组分配给_bar。)

#include <iostream>

using namespace std;

class Foo 
public:
    int* _bar;
    Foo() 
        int bar[1] = 0;
        this->_bar = bar;
    
    Foo(int* bar) 
        this->_bar = bar;
    
;

int main()
    
    int bar[1] = 0;
    Foo* foo1 = new Foo(bar);
    cout << to_string(foo1->_bar[0]) << "\n";

    Foo* foo2 = new Foo();
    cout << to_string(foo2->_bar[0]) << "\n";

    return 0;

【问题讨论】:

foo2 的情况下,bar[1] 是构造函数内的局部数组变量。一旦构造函数结束,它将无法访问。 【参考方案1】:

foo2 的情况下,bar[1] 是构造函数内的局部数组变量。一旦构造函数结束,它将无法访问。

而且由于您将其存储为指针,因此当堆栈上的该空间被用于其他任何内容时,您将从该位置获取数据;可能是垃圾。

如果构造函数中的bar[1] 是一个static 变量,它会为你工作。当然,我知道这只是一个测试代码,你不会在真正的代码中这样做。

【讨论】:

【参考方案2】:

在默认构造函数情况下,您将 bar[1] 声明为构造函数的局部变量,并且 this->_bar 指向 bar 的内存位置。由于 bar[1] 作用域在构造函数的最后一行结束, foo2 将指向一些垃圾值而不是 0。您可以执行类似的操作或将 bar[1] 声明为静态变量。

class Foo 
    public:
        int* _bar;
        int bar = 0;
        Foo() 
            this->_bar = &bar;
        
        Foo(int* bar) 
        this->_bar = bar;
   
;

【讨论】:

以上是关于为啥这个数组的第 0 个索引仍然不等于 0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Swift 数组插入和 removeAtIndex 操作行为不一致?

NumPy 数组切片索引

如何排序多维数组的第二个索引?

php把索引数组的第一个元素移除后索引不重置

为啥在由数组实现的堆中,索引 0 未被使用?

在可变大小的字符串数组中,如果输入来自 0 索引 A[0] 不可访问;如果输入来自索引 1,A[0] 和 A[1] 不可行为啥?