| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 523 人关注过本帖
标题:二个有意思的C调试现象
只看楼主 加入收藏
z_j_j_1
Rank: 4
等 级:业余侠客
威 望:1
帖 子:62
专家分:213
注 册:2015-4-4
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:6 
二个有意思的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。那么问题来了:你造原因吗?

搜索更多相关主题的帖子: include 
2015-04-04 17:03
喝醉的猫
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:68
专家分:120
注 册:2012-3-13
收藏
得分:0 
好乱的说,菜鸟表示不知道,期待结果!希望能学到点东西
2015-04-04 18:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
讨论未初始化变量的值没有意义

另外 你贴出来的东西实在是很乱 我根本没心情看
2015-04-04 20:45
z_j_j_1
Rank: 4
等 级:业余侠客
威 望:1
帖 子:62
专家分:213
注 册:2015-4-4
收藏
得分:0 
回复 3楼 zklhp
对不起贴的确实有点慢,表大神包涵.
关于本贴 现在没有讨论未初始化的值,而是探讨ubuntu对不同的数据类型未初始化的值的不同处理方式。
你知道为什么这样处理吗?难道你真的以为是编译器随机的吗?
2015-04-06 10:12
zhou78yang
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:18
专家分:100
注 册:2014-3-18
收藏
得分:20 
回复 4楼 z_j_j_1
其实嘛,gcc不是随机的,而是随意的,它只管把你写的程序翻译成机器语言,编译成一个可执行文件,管你变量有没有初始化。

   你执行程序的时候是系统随机分配内存给你的,哪有空就扔哪运行。至于为什么有些数每次都一样,有些数看起来随机。只不过是因为你的数组是存放在栈里边的,而栈先前用来存放过你程序的数据,一些变量刚好存放在原先栈内存放确定数据的位置,所以每次都一样;而有些变量刚好存放在原先栈内那些用来存放内存的位置,所以看起来像随机数。
   你如果闲着没事干可以查看内存啊,那些所谓的随机数每次的差值应该都一样,因为程序运行时内存相对位置是一样的。

至于(2)里边j的地址是负数也就是刚好分配到首位是1的地址罢了

PS.既然是在Linux下编程,要记得加返回值嘛
2015-04-07 03:00
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
楼主用%d %ld打印数据就认为是整数,是负数,那楼主可以试试%c, %u, %x, %f,看打印出来的是什么?

总有那身价贱的人给作业贴回复完整的代码
2015-04-07 08:03
z_j_j_1
Rank: 4
等 级:业余侠客
威 望:1
帖 子:62
专家分:213
注 册:2015-4-4
收藏
得分:0 
回复 5楼 zhou78yang
理解了,谢谢哈!
2015-04-07 08:17
快速回复:二个有意思的C调试现象
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017730 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved