免费注册 查看新帖 |

Chinaunix

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

初始化后的全局变量找不着了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-10 09:58 |只看该作者 |倒序浏览
你们好。
Hi,everyone.我在下面的代码里定义了一个全局变量和一个局部变量,可是局部变量有效,全局变量是无效的。请看代码如下:
  1. char  testa[10]="hello";
  2. int main()
  3. {
  4. char testb[10]="world";
  5. //print(testa); //当我用这个函数打印时,没有字符串显示。
  6. print(testb); //这个函数可以正常显示字符串;
  7. ..............
  8. }
复制代码
这是mapfile文件
  1. ............
  2. .init_array
  3. *(.init_array)
  4.                 0x00011000                PROVIDE (__init_array_end, .)
  5.                 0x00011000                PROVIDE (__fini_array_start, .)
  6. .fini_array
  7. *(.fini_array)
  8.                 0x00011000                PROVIDE (__fini_array_end, .)
  9. .data           0x00011000       0x16
  10. *(.data .data.* .gnu.linkonce.d.*)
  11. .data          0x00011000        0xa kernel/global.o
  12.                 0x00011000                teststring
  13. *fill*         0x0001100a        0x2 00
  14. .data          0x0001100c        0xa kernel/main.o
  15.                 0x0001100c                testa
  16. ..................
复制代码
为什么定义了一个全局变量后,在main函数内没显示字符串,但是用局部变量却正常显示? 我用bochs查了下地址0x0001100c(即testb的地址), 发现全部是空。有没有这种可能性:数据段(.data)的testa自动被加载了原始的空串,而自定义的全局串却没有加载进去?

请大家帮帮我,指点下。谢谢你们!

[ 本帖最后由 morexpc 于 2007-8-10 15:37 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-10 15:07 |只看该作者
我在“char testa[10]="hello"”之前加了const关键字就可以了,即
  1. const char  testa[10]="hello";
  2. int main()
  3. {
  4. char testb[10]="world";
  5. print(testa); //函数正常打印。
  6. print(testb); //这个函数可以正常显示字符串;
  7. ..............
  8. }
复制代码
一切正常,我去查了下testa的地址(这次在.rodata段),里面有相应数据。大家能帮我看看什么缘故吗?谢谢!

[ 本帖最后由 morexpc 于 2007-8-10 16:29 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2007-08-10 18:39 |只看该作者
原帖由 morexpc 于 2007-8-10 09:58 发表
你们好。
Hi,everyone.我在下面的代码里定义了一个全局变量和一个局部变量,可是局部变量有效,全局变量是无效的。请看代码如下:char  testa[10]="hello";
int main()
{
char testb[10]="world";
//print ...

楼主用嘛编译器?嘛操作系统?以及其他一些有帮助的信息,例如编译方式等。

论坛徽章:
0
4 [报告]
发表于 2007-08-10 22:54 |只看该作者
我用的是linux下的gcc编译器 gcc -o main.o -I include -c -fno-builtin main.c
ld -s -Ttext $(entrypoint) $(objs) -o $(sparrowkernel) -Map mapfile
entrypoint= 0x10100  
objs= kernel/kernel.o kernel/main.o ........

sparrowkernel= kernel.bin

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2007-08-11 13:22 |只看该作者
原帖由 morexpc 于 2007-8-10 22:54 发表
我用的是linux下的gcc编译器 gcc -o main.o -I include -c -fno-builtin main.c
ld -s -Ttext $(entrypoint) $(objs) -o $(sparrowkernel) -Map mapfile
entrypoint= 0x10100  
objs= kernel/kernel.o kern ...

果然……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP