假设我有一个for循环和一个非常大的结构作为堆栈变量:
for (int x=0 ; x <10; x++)\n{\n MY_STRUCT structVar = {0};\n \xe2\x80\xa6code using structVar\xe2\x80\xa6\n}\nRun Code Online (Sandbox Code Playgroud)\n每个编译器实际上都会在每个循环开始时将结构清零吗?或者我需要使用memset它来将其归零吗?
这是一个非常大的结构,我想在堆栈上分配它,并且我需要确保它的每个成员在每次迭代开始时都清零。那么我需要使用吗memset?
我可以手动检查我编译的可执行文件,但我需要确保是否有任何标准,或者它只取决于编译器。
\n请注意,此代码确实可以编译。我正在使用 Visual Studio。
\n\n\n每个编译器实际上都会在每个循环开始时将结构清零吗?
\n
任何符合 C 标准的编译器都会执行此操作。从这个 C11 标准草案(粗体强调我的):
\n\n\n6.8 语句和块
\n\xe2\x80\xa6
\n
\n3 \xc2\xa0\xc2\xa0块允许将一组声明和语句分组到\n一个语法单元中。具有自动存储持续时间的对象的初始值设定项以及具有块作用域的普通标识符的可变长度数组声明符都会被评估,并将值存储在对象中(包括在没有初始值设定项的对象中存储不确定值)到达声明的时间\按照执行顺序,就好像它是一个语句,并且在每个\n声明中按照声明符出现的顺序。
for在or循环的情况下while,循环的作用域块内的声明/初始化器在循环的每次迭代中都会重复到达。