不同内存位置内的 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.
它与上述问题不重复,因为 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.