为啥这个数组的第 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 操作行为不一致?
在可变大小的字符串数组中,如果输入来自 0 索引 A[0] 不可访问;如果输入来自索引 1,A[0] 和 A[1] 不可行为啥?