当前位置:  技术问答>linux和unix

有一段代码看不懂。关于系统启动时初始化的代码

    来源: 互联网  发布时间:2016-03-16

    本文导语:  184 void 185 cyg_hal_invoke_constructors (void) 186 { 187 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG 188     static pfunc *p = &__CTOR_END__[-1]; 189      190     cyg_hal_stop_constructors = 0; 191     for (; p >= __CTOR_LIST__; p--) { 192   ...

184 void
185 cyg_hal_invoke_constructors (void)
186 {
187 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
188     static pfunc *p = &__CTOR_END__[-1];
189     
190     cyg_hal_stop_constructors = 0;
191     for (; p >= __CTOR_LIST__; p--) {
192         (*p) ();
193         if (cyg_hal_stop_constructors) {
194             p--;
195             break;
196         }
197     }
198 #else
199     pfunc *p;
200 
201     for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--)
202         (*p) ();
203 #endif
204 }
这段代码是eCos系统里的那个总的初始化函数,可是&__CTOR_END__[-1]这里怎么写成了-1,   谢谢。

|
同意老猫的说法。

标准的C语言对数组边界是不检查的,对数组的操作跟指针一样。
虽然gcc的扩展也有边界检查,比如加上-fbounds-check,可是我这里试了却不管用,不知什么原因。

|
不明白什么,数组下标又没规定必须是正整数

char a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
char *b = a + 2;

b[0] == a[2];
b[-1] == a[1];
b[-2] == a[0];



|
80 typedef void (*pfunc) (void);
181 extern pfunc __CTOR_LIST__[]; 
182 extern pfunc __CTOR_END__[]; 

声明了两个函数指针数组

这可能与两个数组的空间分配有关,
先分配 __CTOR_LIST__[]; 数组,紧接着分配__CTOR_END__[]; 数组。
就是说__CTOR_LIST__[end + 1]  = __CTOR_END__[0]
而__CTOR_END__[-1]  = __CTOR_LIST__[end] 

p = &__CTOR_END__[-1]

也就是说,p = __CTOR_LIST__[end] 的地址
最后一个函数指针的地址。

不过语法上GCC这样不允许的,对于数组编译时检查前越界,而不检查后越界的。
个人意见。



|
检查吗?
那这样怎么办?

scanf("%d", &i);
printf("%d", a[i]);

|
楼主你钻到牛角尖里了

|
刚才特地实验了一下,没有报错也没有警告,
可能我记错了,我记得好像有警告呀?
在《C陷阱与缺陷》中说的,也可能是说的老的GCC,毕竟《C陷阱与缺陷》这本书很多年了。

|
__CTOR_END__[-1]就是*(__CTOR_END__ + (-1))

|
可能这是一个双向链表,__CTOR_END__指向链表尾部, *(__CTOR_END__ + (-1)) 就回到链表头

|
一般是从0开始没错啦,说白了这里就是把p指到它前面一个。

    
 
 

您可能感兴趣的文章:

  • 请问这段初始化代码为什么出错??谢谢
  • 关于Linux内核墙上时钟初始化代码的疑问
  • 【求】陷阱门初始化代码释疑
  • VC++角色游戏中的人物初始化模块代码实例
  • Python 初始化多维数组代码
  • lunix下,用java在代码中启动另外一个进程遇到的问题,新启动的进程被阻塞.
  • 如何实现arm的启动代码
  • linux的启动过程~ 从源代码的角度
  • linux内核中的关于热启动的处理代码在哪里哦 ?
  • c# 开机启动项实例代码
  • LILO问题:启动时只到L,没有错误代码,只有光标在L后闪烁
  • 哪本linux源码分析的书里详细讲解了Linux的核心启动代码
  • Linux启动过程到哪个阶段之后的源代码全是C语言而不是汇编写的?
  • 请问 如何用user用户启动一个程序(或者脚本) 在这个程序(或脚本)里将用户转为root 然后用root执行下面的代码
  • 如何看red hat linux的源代码?&& eth0代表什么?为什么启动时总是eth0 failed?
  • 装完linux后启动只出现一个L,没有错误代码,以前的98和XP也没法引导,谁知道原因?
  • 嵌入式 linux开发中,加入网络通信代码后,ARM9启动后在超级终端打印出错误信息,请帮忙解决!谢谢
  • C#添加注册表启动项的实例代码
  • 菜鸟问题:如何在linux下启动c,写代码,如何在linux下安装数据库软件和配置相关内容
  • vbs打开ie两种方法 在VBScript中启动IE浏览器的实现代码
  • arm启动代码疑问(boot.S)
  • C#代码设置开机启动示例
  • QT4在Ubuntu9.04下的问题 查看代码时“不能启动/usr/bin/uic-qt4”
  • 求助: Linux下查看代码的工具kscope-1.9.4 编译安装成功后 无法启动成功。
  • C#启动和停止windows服务的实例代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • javascript 添加到收藏夹和书签代码示例
  • 在JBuilder中,为什么编写的代码中,当代码出现关键字时,后面的部分代码就移位了,当在有关键字的那些代码行进行选择时,也会出现鼠标位
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • 为什么两行代码间不加入其他代码就崩溃,而加入了日志代码后就不崩溃?
  • JSP中清空cookie代码参考
  • 在ubuntu8.10 新立得中安装anjuta,为什么没有代码提示功能,怎么做才有,还有自动代码补全和代码提示有什么区别,
  • Python获取网页编码的方法及示例代码
  • 到底怎么样的代码算是有效代码?请教了。。
  • HTML网页中的html body onload自动跳转方法介绍及自动跳转代码示例
  • 如果要研究源代码以提高自己,哪一个开放源代码的软件比较合适?
  • php通过socket_bind()设置IP地址代码示例
  • linux源代码的时间函数源代码
  • boost库lexical_cast不同用法代码参考
  • gdb的时候代码 next显示的代码乱了
  • 通过javascript库JQuery实现页面跳转功能代码
  • 源代码!源代码!
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 哪位会使用代码保护工具WingGuard来保护java代码?
  • HTML网页的Meta Refresh自动跳转方法介绍及Meta Refresh自动跳转代码示例
  • 如何得到C语言代码对应的汇编代码?
  • Linux c++虚函数(virtual function)简单用法示例代码
  • RedHat Linux是开放源代码的吗?如何能看见它的源代码,如何进行修改?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3