不同内存位置内的 C++ 默认数组值

C++ default array values within different memory locations

它与上述问题不重复,因为 statics 差异未涵盖并且答案有错误。

这是一个关于进程内内存组织的基本分解问题,更具体地说,是默认数组值。

在下面的代码中:
arr1 在机器指令附近的内存块中静态分配,并且在某些时候默认初始化为 0
arr2 应该在创建函数框架时在堆栈上分配,它永远不会被默认初始化
arr3 等同于 arr1 [?]
arr4 等同于 arr2 [?]
arr5 ... 除了上述两个问题,现在我的主要问题是 class 中的 static 变量与函数中的 static 变量有何不同?我无法访问未初始化的 arr5 元素。在哪些情况下我可以?

int arr1[5];    

void func() {   
    int arr2[5];        printf("%d\n", arr2[0]);          // [2]
    static int arr3[5]; printf("%d\n", arr3[0]);          // [3]
}

class MyClass {
public:
    int arr4[5];
    static int arr5[5];
};

int main() 
{   
    printf("%d\n", arr1[0]);                // [1]

    func();

    MyClass obj;
    printf("%d\n", obj.arr4[0]);            // [4]
    //printf("%d\n", obj.arr5[0]);          // [5]


    std::cin.get();
}

输出:

0
-858993460
0
-858993460

根据this article arr5 已声明但未定义。

添加

int MyClass::arr5[5];

声明 class MyClass 之后。比你能得到 obj.arr5[0]

class MyClass {
public:
    int arr4[5];
    static int arr5[5];
};

int MyClass::arr5[5];

arr1 作用域是全局的,一直存在到程序结束。 arr2 作用域是本地的,每次调用函数时都会创建和销毁它。

arr3 范围是本地的。局部静态变量是在第一次使用时创建和初始化的,而不是在程序启动时,当程序存在时将被销毁。 arr1 和 arr2 在范围和初始化时间方面是不一样的。 arr1 范围是全局 arr3 本地(函数范围)。 arr1会在程序启动的时候初始化,arr3的时候函数会被调用。

arr4 是一个 MyClass 成员,每次当你 create/destroy MyClass 对象时它都会是 created/destroyed。它只能通过 MyClass 对象访问。所以arr4和arr2是不一样的。 arr5 是静态 class 成员。它不与 MyClass 对象搭讪。您可以在不创建 MyClass 对象的情况下使用它。可以通过以下方式直接访问MyClass::arr5.