数组何时自动初始化为其默认数据类型?
Posted
技术标签:
【中文标题】数组何时自动初始化为其默认数据类型?【英文标题】:When is an array automatically initialized to it's default datatype? 【发布时间】:2019-11-16 15:40:04 【问题描述】:编译器何时自动将数组初始化为默认数据类型?
我知道在这个例子中,数组将被初始化,除了我期待 (reading here) \0
char 值而不是在我的控制台中有 spaces
的事实(至少这是我的想法因为什么都没有)。
#define MAX_LENGTH 25
// Array global
int vector[MAX_LENGTH];
char vector_char[MAX_LENGTH];
int main()
//Print int array
for(int i = 0;i < MAX_LENGTH; i++)
cout << vector[i] << " "; // All outputs 0
cout << endl;
//Print char array and output text to see that there is
//Something printed
cout << "start";
for(int i = 0;i < MAX_LENGTH; i++)
cout << vector_char[i] << " "; //All outputs...
cout <<"end"<< endl;
return 0;
我遇到的另外两种情况是数组在函数内部时(其中的值将是“垃圾”或“不可预测”,例如:
int main()
int internal_vector[MAX_LENGTH];
for(int i = 0;i < MAX_LENGTH; i++)
cout << internal_vector[i] << " ";
cout << endl;
return 0;
另一个当数组是类的成员时(如果你尝试任何事情,你会惊讶于数组将包含垃圾值:
class MyClass
private:
int array[100];
...
那么,数组什么时候会自动初始化为它的默认数据类型,什么时候我应该创建自己的函数来初始化每个元素?
【问题讨论】:
哇:“int vector[MAX_LENGTH]; char vector_char[MAX_LENGTH];”请不要在 C++ 中使用普通的 C 样式数组。绝不。使用std::vector
或其他 STL 容器。您甚至可以这样命名您的 C 样式数组。 . .
究竟是什么让您相信char c=0; std::cout << c
会产生“\0”作为输出?这不是真的。您的 char 向量也是零初始化的,但 char 0 根本没有显示,所以您看到的只是空格。
@SamVarshavchik 我虽然 char 默认值是 \0
因此在任何函数之外声明它都是值
@ArminMontigny 一个链接让我更好地理解你在说什么会帮助我
我的评论很清楚。再读一遍。如果您在调试器中检查char
向量的值,您会惊讶地发现它们确实是\0
s。您缺少的是\0
字符将向std::cout
输出两个字符,一个反斜杠和一个数字0。无论你从哪里读到,那个来源都是不正确的。
【参考方案1】:
全局对象有static storage duration,它们从一开始就是zero-initialized,
对于每个具有静态或线程本地存储持续时间
that is not subject to constant initialization (since C++14)
的命名变量,在任何其他初始化之前。如果 T 是标量类型,则对象的初始值是显式转换为 T 的整数常量零。
如果T是数组类型,每个元素都初始化为零
这意味着vector
的所有元素将被初始化为0
,vector_char
的所有元素将被初始化为'\0'
。
另一方面,internal_vector
的所有元素都将被初始化为default initialization 中的不确定值。
如果 T 是数组类型,则数组的每个元素都是默认初始化的;
否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。
具有自动和动态存储持续时间的非类变量的默认初始化会生成具有不确定值的对象(静态和线程本地对象获取zero initialized)
注意,array
有点复杂,其存储时长取决于实例的声明方式。
【讨论】:
一个类的成员有什么存储期限? @CătălinaSîrbu 这取决于对象。答案已修改。以上是关于数组何时自动初始化为其默认数据类型?的主要内容,如果未能解决你的问题,请参考以下文章