免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3994 | 回复: 10
打印 上一主题 下一主题

[C] c语言全局变量的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-09 23:56 |只看该作者 |倒序浏览
我写了这样一段代码

char c='b';

int main()
{
     char *p=&c;
     printf("%p\n",p);
     return 0;
}

运行后显示的地址为0x804a014
我运行了几次,发现都是这个地址,我猜想一个c语言程序的全局变量如果是定义了
则在内存中的数值就定了,不会改变了,即使结束了该进程,不知道对不对?

然后我在原程序中加入了另一行代码
printf("%c\n",(char *)0x804a014);
显示的结果为A,我不能理解为什么是大A,如果是巧合的话我又试了别的其他字符都是其大写字符,
这是为什么?
然后我在源程序中把char c改为char c='c';
结果依然显示A,这就有些解释不通了,明明0x804a014对应的直应该是A 阿,怎么没变化呢?


我最后写的程序为

char c='b';
int main()
{
   char *p=&c;
   c = 'c';
  printf("%p\n",p);
    printf("%c\n",*p);
  printf("%c\n",(char *)0x804a014);
   return 0;
}
运行结果为
0x804a014
c
A
不是很明白为什么会有这样的结果
p的值就是0x804a014,我显示这个地址的值应该是c才对阿,为什么一直是A呢?

[ 本帖最后由 iceriver68 于 2010-1-10 00:08 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2010-01-10 00:06 |只看该作者
>> 0x804a014
      0x804a041


'A' = 0x41

论坛徽章:
0
3 [报告]
发表于 2010-01-10 00:09 |只看该作者

回复 #2 mik 的帖子

不好意思,由于我的疏忽,出现了排版错误,全部都是014,编译的程序我没写错

论坛徽章:
0
4 [报告]
发表于 2010-01-10 00:23 |只看该作者
我发的那个程序确实有点小问题,结果应该显示空

下面是我的理解:
一个进程结束则在该程序内分配的全局变量,
常数及其所用的栈所占的内存都被清空,而自己用maclloc等函数申请的内存空间为堆,进程结束,如果没有free也依然
会占据内存,不知道理解的对不对

论坛徽章:
0
5 [报告]
发表于 2010-01-10 01:36 |只看该作者
lz没有对char *进行deference,所以当然得不到c了
malloc的东西没free在进程结束的时候操作系统会进行善后工作,帮你回收的

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
6 [报告]
发表于 2010-01-10 07:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2010-01-10 11:12 |只看该作者
lz那个是0x804a041吧?
我这边是重现不出来的

  1. printf( "%c\n", ( char * )0x804a014 );
复制代码

由于需要的是一个%c的,所以只取了低字节也就是0x14,但是0x14对应的asic码是不可见字符
如果是0x804a041的话出来是个'A',因为0x41的对应的就是'A'
2楼的回帖很有道理

论坛徽章:
0
8 [报告]
发表于 2010-01-10 12:55 |只看该作者

回复 #1 iceriver68 的帖子

0x804a014这个地址是逻辑地址,当让是不变的。
每次运行改变的只是物理地址而已。

汇编你的程序,就能看到这个地址。

论坛徽章:
0
9 [报告]
发表于 2010-01-11 12:46 |只看该作者
printf( "%c\n", ( char * )0x804a014 );
这句话的意思是想打印0x804a014位置的一个字节吧,如果是,语句要改成:
printf( "%c\n", *(( char * )0x804a014));

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2016-04-23 14:25:46操作系统版块每日发帖之星
日期:2016-05-09 06:20:00
10 [报告]
发表于 2010-01-11 18:17 |只看该作者
楼上牛人!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP