二个有意思的C调试现象
二个有意思的C调试现象
二个有意思的C调试现象:
(1)
eg1:
#include<stdio.h>
intmain(int argc,char *argv[])
{
chara[100];
printf("a[0]value is:%d\n",a[0]);
}
此时a[0]输出的是随机的整形数。
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ gcc -g -o eg1.debug eg1.c
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ./eg1.debug
a[0]value is:12
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ./eg1.debug
a[0]value is:-116
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ./eg.debug
bash: ./eg.debug: 没有那个文件或目录
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ./eg1.debug
a[0]value is:28
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ./eg1.debug
a[0]value is:-4
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$
Eg2:
#include<stdio.h>
intmain(int argc,char *argv[])
{
inta[100];
printf("a[0]value is:%d\n",a[0]);
}
此时a[0]输出的是0。
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ gcc -g -o eg2.debug eg2.c
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ./eg2.debug
a[0]value is:0
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ./eg2.debug
a[0]value is:0
eg3:
#include<stdio.h>
intmain(int argc,char *argv[])
{
inta[100];
printf("a[1]value is:%d\n",a[1]);
}
此时a[1]输出的是随机的整形数。
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ gcc -g -o eg3.debug eg3.c
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ls
eg1.c eg1.debug eg2.c~ eg3.c eg3.debug
eg1.c~ eg2.c eg2.debug eg3.c~ 二个有意思的C调试现象.doc
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ./eg3.debug
a[0]value is:0
a[1]value is:-1217104564
a[2]value is:-1217071780
a[5]value is:-1217207588
a[99]value is:-1074396132
k40af@K40AF:~/EasyARM-iMX283/Chapter8/二个有意思的C调试现象$ ./eg3.debug
a[0]value is:0
a[1]value is:-1216953012
a[2]value is:-1216920228
a[5]value is:-1217056036
a[99]value is:-1073821428
注:eg1-eg3代码是在ubuntugcc下编译 调试的。
分析:在ubuntu gcc环境下 数组 char a[100] 没有初始化的时候 a[0]-a[99] 输出均为随机数;
在ubuntu gcc环境下 数组 int a[100] 没有初始化的时候 a[0] 输出均为0 a[1]-a[99]输出均为随机数;
这是什么原因呢?难道你真的认为这是编译器没有考虑到相关情况吗?
如果你觉得不是可以和我一起来验证哦!-----凌晨
(2)
#include<stdio.h>
int main(int argc,char *argv[])
{
int j = 10;
long int tmp = 0;
tmp = (long int)(&j);
printf("variable j address:%ld\n",tmp);
}
在ubuntu gcc环境下 此时计算机为变量j分配的存储地址输出是负数:variable j address:-1081997500。那么问题来了:你造原因吗?