代码改变世界

c语言中指针数组易错的一个地方

2013-08-23 12:57  zhanjl  阅读(237)  评论(0)    收藏  举报

定义一个字符数组 char a[9] = "abcdefgh"

现在取c = a[i]

编译器符号表中有一个地址9980

运行时步骤一:取i的值,将它和9980相加

运行时步骤二:取出地址(9980+i)处的内容

 

如果定义char *p = "abcdefgh"

取c = p[i]

编译器符号表中p的地址为4624

运行时步骤一:取出地址4624的内容为5081

运行时步骤二:计算5081+i,得到新地址

运行时步骤三:取出地址(5081+i)处的内容

 

所以假如在文件一种定义char a[9] = "abcdefgh"

而在文件二中声明extern char *a;

然后再使用a[i]时,编译器会把a认为是一个指针,然后采用上面的指针三个步骤操作,首先取出第一个字符,然后把该字符加上i当做地址,很明显会发生错误。

所以在文件二中必须声明为一个字符数组extern char a[];