extern用于数组和指针

<C专家编程>中有一示例,文件1中是p的声明,文件2中是p的定义,大致如下:

文件1(.h)

extern char p[]; (第一种写法,正确)  

extern char* p; (第二种写法,错误)


文件2(.cpp)

char p[10];  

     

如调用p[i],则第二种写法程序会崩溃.你可能会认为数组名就是指针,为什么会崩溃呢?

<C专家编程>有下面一段解释:

p在这里被声明为extern char* p,而它原来的定义却是char p[10].这种情况,当用p[i]这种形式提取这个声明的内容时,实际上得到的是一个字符.但按照上面的方法,编译器却把它当成是一个指针,把ASCII字符解释成为地址显然牛头不对马嘴.如果此时程序当掉,你应该额手称庆.否则的话,它很可能会污染程序地址空间的内容,并在将来出现莫名其妙的错误.


上述解释有些不容易理解,下面我详细解释下.

第一种写法,调用p[i],编译器符号表具有一个地址x.运行时步骤1:取i值与x相加.运行时步骤2:取地址(x+i)的内容.

第二种写法,调用p[i],编译器符号表具有一个p,地址为x,运行时步骤1:取地址x的内容,即y.运行时步骤2:取得i的值,并将它与y相加.运行时步骤3:取地址(y+i)的内容.

所以,第二种写法,声明的读取方法,跟实际p的定义有差别.将文件1,p[10]中的字符又解释成指针,假设为m,然后使用m的内容,导致程序崩溃.







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值