Chinaunix首页 | 论坛 | 博客
  • 博客访问: 438626
  • 博文数量: 132
  • 博客积分: 2511
  • 博客等级: 大尉
  • 技术积分: 1385
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-11 15:10
文章分类

全部博文(132)

文章存档

2012年(18)

2011年(35)

2010年(60)

2009年(19)

分类: LINUX

2012-04-15 20:48:05

前几天,同事在使用我之前的写的一份代码时出现了程序崩溃,让我过去看一下,刚瞅了几眼,就发现了有个数组和指针使用extern的问题。
有个全局变量,开始我定义时使用的是数组,假设定义为int a[100];在另外一个文件中使用该数组时,用extern int a[];进行了声明。
结果后来又把a由静态数组改成了内存分配,即定义成了int *a;之后进行了内存分配。但另一个文件中的extern没改。。
我写完之后简单测了一下,没触发该问题。。

C专家编程还是C缺陷与陷阱中讲过这个问题,一不小心就犯错了。

int a[10];定义的是一个数组,它是一个常量,a代表的就是该数组的首地址,它不需要再由另外的空间来存储它;
int *a;定义的是一个指针,它是一个变量,本身也需要有个空间来存储它本身,然后它的值再表明自己指向的地址。
我觉得正是上面的区别,使得如果extern中混用数组和指针的定义时,会导致地址非法访问。
阅读(3865) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

bedreaming2012-04-17 09:50:19

GFree_Wind: 这个错误暴露了两个问题:
1. 如你文中所说的问题——原因就不说了,大家都知道;
2. 代码风格不好。
   1) 尽量不要暴露全局变量;
   2)暴露的话,变量的声明.....
不错,这样写程序确实很容易出问题,而且程序中大量使用了全局变量。。
不过在可预见的时间内,由于代码一直在现网上跑着,估计改的可能性不大。。FT。

GFree_Wind2012-04-16 11:46:51

这个错误暴露了两个问题:
1. 如你文中所说的问题——原因就不说了,大家都知道;
2. 代码风格不好。
   1) 尽量不要暴露全局变量;
   2)暴露的话,变量的声明应该在头文件中,且由你维护。这样就不会造成改   变类型造成的错误。