当前位置: 技术问答>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, 谢谢。
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,可是我这里试了却不管用,不知什么原因。
标准的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];
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这样不允许的,对于数组编译时检查前越界,而不检查后越界的。
个人意见。
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陷阱与缺陷》这本书很多年了。
可能我记错了,我记得好像有警告呀?
在《C陷阱与缺陷》中说的,也可能是说的老的GCC,毕竟《C陷阱与缺陷》这本书很多年了。
|
__CTOR_END__[-1]就是*(__CTOR_END__ + (-1))
|
可能这是一个双向链表,__CTOR_END__指向链表尾部, *(__CTOR_END__ + (-1)) 就回到链表头
|
一般是从0开始没错啦,说白了这里就是把p指到它前面一个。