一道C笔试题

 文件1里声明全局变量:int array[5];
文件2里声明全局变量:extern int *array;
问在运行时会不会报错,如果会,是在编译时还是在链接时?
答:编译与链接时均不报错,当用array[i]存取数组中元素时,运行时报错!
原因:
int array[5];    // :告知编译器,array是个数组名,其值就是元素的首地址
extern int *array;   // :告知编译器,array是个指针,要知道 指针不等于数组名的!

具体的解释见下面的汇编:
//extern int array[5]; a[4]=123;
movl $123, array+16
声明成 数组时, array是个地址,array[i]实际上就是array+i


//extern int *array; a[4]=123
movl array, %eax
addl $16, %eax
movl $123, (%eax)
声明成指针时,需要对指针进行解引用
就是 先把指针里存放的值+偏移 然后解引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值