【发布时间】:2021-08-19 07:25:39
【问题描述】:
据我了解,C 中未初始化的数组意味着为数组分配的内存中的垃圾值。但是当我对此进行实验时。 所以,我尝试了这个。
#include <stdio.h>
int main (){
int j[10];
for(int k = 0; k < 10;k++){
printf("j[%d]:%d\n",k,j[k]);
}
}
这是输出:
j[0]:0
j[1]:0
j[2]:0
j[3]:0
j[4]:0
j[5]:0
j[6]:0
j[7]:0
j[8]:0
j[9]:0
我假设 clang 只是通过将默认值放入其中来修复的。我正在使用在 M1 MacBook Air 上运行的 Apple clang 版本 12.0.5 (clang-1205.0.22.11)。 现在这是令人困惑的部分:
#include <stdio.h>
int main (){
int i =10;
int j[i];
for(int k = 0; k < 10;k++){
printf("j[%d]:%d\n",k,j[k]);
}
}
这是我得到的: 第一次运行
j[0]:13172736
j[1]:1
j[2]:13172736
j[3]:1
j[4]:0
j[5]:0
j[6]:1865774432
j[7]:1
j[8]:48
j[9]:0
第二次运行
j[0]:72499200
j[1]:1
j[2]:72499200
j[3]:1
j[4]:0
j[5]:0
j[6]:1806906720
j[7]:1
j[8]:48
j[9]:0
第三次运行。
j[0]:8912896
j[1]:1
j[2]:8912896
j[3]:1
j[4]:0
j[5]:0
j[6]:1870689632
j[7]:1
j[8]:48
j[9]:0
第四:
j[0]:15417344
j[1]:1
j[2]:15417344
j[3]:1
j[4]:0
j[5]:0
j[6]:1863988576
j[7]:1
j[8]:48
j[9]:0
这里似乎有一些规律,而且非常一致,这是从哪里来的?
【问题讨论】:
-
IIRC 在调试模式构建中,一些编译器使用一些特殊值初始化变量以明确它们未初始化。
-
未定义的行为可以产生各种结果,包括一致的模式。 避免它。
-
“垃圾”并不意味着“随机”。它的意思是“没用”、“垃圾”或“垃圾”。它来自以前的活动,可能那个活动是一致的。
-
This is the only reference I found。引用:“未初始化的变量未设置为零;它们被初始化为特殊的填充模式,
0xcc和0xcd(取决于内存是在堆栈上分配还是在调试堆上分配)。”。更新:还找到this in-deep explanation。 -
@UweKeim,谢谢,第二次阅读内容丰富。