我理解静态可以为c ++中的东西提供持久性,但是我很困惑什么时候需要它。
例如,如果我有一个功能:
const int get5(){
int x = 5;
return x;
}
我打印出来的回报,5会自然出现。但是,如果我尝试使用数组:
const int* getArray() {
int arr[5];
arr[0] = 5;
arr[1] = 6;
arr[2] = 7;
arr[3] = 8;
arr[4] = 9;
return arr;
}
我迭代遍历数组的每个元素,我只是变得粗鲁:
const int* ptr = getArray();
for (int index = 0; index < 5; index++) {
cout << ptr[index] << endl;
}
结果:
5
19920968
257848734
258124688
258124688
但是,如果我使用静态修饰符为arr添加前缀,并赋予其持久性,则可以:
5
6
7
8
9
我的问题是,为什么我需要将数组声明为静态,因为它的值是持久的,但在其他类型中,它不是必需的?谢谢!
答案 0 :(得分:5)
不同之处在于,在第一个示例中,您将返回副本,在第二个示例中,您将返回指针。当您返回副本时,原始值是否被销毁无关紧要。但是当你返回一个指针时,你必须确保指向对象的生命周期超出函数的末尾,否则你将得到未定义的行为。
答案 1 :(得分:1)
我的问题是,为什么我需要将数组声明为
static
,因为它的值是持久的,但在其他类型中,它不是必需的?
这是因为对于数组,返回指向数组数据的指针,而对于其他类型,它是数据的副本。
在以下功能中:
const int* getArray() {
int arr[5];
...
return arr;
}
最后一个语句中的表达式中的 arr
衰减为指向数组第一个元素的指针。函数getArray()
返回此指针(以及不数组的副本),该指针指向具有自动存储持续时间的数据。因此,在函数返回后,不应再访问该数据。
但是,如果将数组arr
声明为static
,即使仍然返回指向数组第一个元素的指针,该数据也会在函数返回后保留。
答案 2 :(得分:1)
arr在本地范围内创建,这意味着一旦函数返回就会丢弃它。它占用的内存(在这种情况下,它很可能驻留在寄存器中)然后由其他进程使用(或者如果使用寄存器则由程序中的下一条指令使用),这就是你看到奇怪值的原因。