这与上面的问题不是重复的,因为没有涵盖statics的差异,并且答案有误。

这是一个有关进程内内存组织的基本细分问题,更具体地说是默认数组值。在下面的代码中:
arr1在机器指令附近的内存块中静态分配,并在某些时候默认初始化为0 arr2应该在创建功能框架时分配在堆栈上,但永远不会默认初始化
arr3arr1 [?]相同
arr4arr2 [?]相同
arr5 ...现在,除了上述两个问题之外,我的主要问题是,类内的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];

08-04 23:40