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

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指到它前面一个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值