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

时间:2019-09-27 08:33:10

标签: c++ arrays memory initialization undefined-behavior

由于jtc -w'<Statement>l[Action]:<*>[-1][Resource]:>*<[-1]' file.json 的差异未涵盖且答案有误,因此它与上述问题并不重复。

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

在下面的代码中:
statics在机器指令附近的内存块中静态分配,并在某些时候默认初始化为arr1
0应该在创建功能框时分配在堆栈上,它永远不会默认初始化
arr2arr3 [?]
arr1arr4 [?]
arr2 ...现在,除了上述两个问题外,我的主要问题是,类内的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();
}

2 个答案:

答案 0 :(得分:3)

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

添加


$adminPermissions = collect(
      array_merge(
          $permissionsForPermissions, 
          $rolePermissions
      )
    )->map(function ($name) {
        return Permission::create([
            'name' => $name
        ]);
    });

声明int MyClass::arr5[5]; 后的

。比您可以获得class MyClass

obj.arr5[0]

答案 1 :(得分:0)

arr1范围是全局的,并且一直存在到程序结束。 arr2范围是局部的,每次调用函数时都会创建和销毁它。

arr3范围是本地的。局部静态变量是在首次使用它们时创建的,并且不会在程序启动时进行初始化,并且会在程序存在时被销毁。 就范围和初始化时间而言,arr1和arr2不同。 arr1作用域是全局arr3局部(函数作用域)。程序启动时,将调用arr3初始化arr1。

arr4是MyClass成员,每次创建/销毁MyClass对象时都会创建/销毁它。只能通过MyClass对象访问它。所以arr4和arr2不一样。 arr5是静态类成员。它不与MyClass对象一起使用。您可以使用它而无需创建MyClass对象。您可以通过以下方式直接访问MyClass :: arr5。