当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [郁闷]搞不懂的extern!
帖子发表于 : 2008-10-14 14:44 
头像

注册: 2007-08-05 17:40
帖子: 4968
送出感谢: 0 次
接收感谢: 4
最近在看一些开源代码,忽然发现使用了没有定义或初始化的变量,查之,原来是extern变量,在1.c中定义但未初始化,2.h中extern,2.c中使用,例如printf。
1.c
代码:
int a;

2.h
代码:
extern int a;

2.c
代码:
#include <stdio.h>
#include "2.h"
int main()
{
printf("%d",a);
}


代码:
gcc 1.c 2.c
./a.out

打印结果0;
于是猜想,变量a并没有显式初始化,一定是编译器给他初始化了。并且初始化为0。
为了配合我现在看的代码,写了简短的代码。2.h中定义一个结构体,并extern 1.c中的这种结构体变量的指针*a。在2.c中定义同样一个指针b并将它的值赋成a,然后使用指针b对其指向的空间显式赋值。
2.h
代码:
struct abc{
int x;
};
extern struct abc *a;

1.c
代码:
#include "2.h"
struct abc *a;

2.c
代码:
#include <stdio.h>
#include "2.h"
int main()
{
       struct abc *b;
        b=a;
        b->x=1;
}

代码:
gcc 1.c 2.c

编译通过,但执行出现段错误。gdb调试显示a,b所指向的地址为0。
--
为了避免这样的段错误,于是在2.c中用malloc给a初始化再赋值给b,不再出现段错误。
但我所看的代码并没有在2.c中对a初始化。于是想在1.c中初始化。
用malloc初始化错误。a=(struct abc*)malloc(sizeof(struct abc*));(这句话是从2.c中copy的)报错。
若显式初始化a->x=1;报->语法错误。
----
在帖子中是否有笔误未知。


最后由 cnkilior 编辑于 2008-10-14 16:06,总共编辑了 2 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: [郁闷]搞不懂的extern!
帖子发表于 : 2008-10-14 15:38 
头像

注册: 2007-03-13 17:26
帖子: 2254
送出感谢: 0 次
接收感谢: 1
代码:
extern struct *a;
struct abc *a;

你的程序是这样? 能编译?


页首
 用户资料  
 
3 楼 
 文章标题 : Re: [郁闷]搞不懂的extern!
帖子发表于 : 2008-10-14 23:12 

注册: 2008-05-24 1:24
帖子: 338
送出感谢: 0 次
接收感谢: 0 次
看 C Primer Plus 第12章


页首
 用户资料  
 
4 楼 
 文章标题 : Re: [郁闷]搞不懂的extern!
帖子发表于 : 2008-10-15 10:37 

注册: 2008-09-16 22:38
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
extern int a 表示外部变量


你可以放在另一个c文件里面

但是清不要放在头文件中

头文件只放宏,谢谢


页首
 用户资料  
 
5 楼 
 文章标题 : Re: [郁闷]搞不懂的extern!
帖子发表于 : 2008-10-15 12:54 

注册: 2008-05-24 1:24
帖子: 338
送出感谢: 0 次
接收感谢: 0 次
teebye:
头文件当然可以放 extern, 你看看 /usr/include/time.h


页首
 用户资料  
 
6 楼 
 文章标题 : Re: [郁闷]搞不懂的extern!
帖子发表于 : 2008-10-15 23:02 
头像

注册: 2007-11-23 9:49
帖子: 1021
送出感谢: 0 次
接收感谢: 1
struct abc *a;

:em06 没有分配内存阿,于是初始化为null了


页首
 用户资料  
 
7 楼 
 文章标题 : Re: [郁闷]搞不懂的extern!
帖子发表于 : 2008-10-16 23:09 
头像

注册: 2008-07-30 23:21
帖子: 13218
地址: freebuilder@yeah.net
系统: Debian stable AMD64
送出感谢: 36
接收感谢: 121
全局变量初始化为 0 等书上都有的。
关于 extern ,顺便卖弄卖弄我的说法:
当一个模块 2.o 引用另一模块 1.o 中的某个变量,不能 #include "1.h" ,只能在当前模块源码 2.c 的可视范围内用 extern 说明。因为 #include 是嵌入而不是引用。外部变量说白了就是在别的模块当中的变量。
注意,编译器只识源文件,不识头文件(那是预处理器的事),为什么必须要有 1.c 就不用解释了吧!


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: [郁闷]搞不懂的extern!
帖子发表于 : 2008-10-21 22:19 
头像

注册: 2007-11-05 19:26
帖子: 635
送出感谢: 0 次
接收感谢: 0 次
引用:
a=(struct abc*)malloc(sizeof(struct abc*))

改成
代码:
a=(struct abc*)malloc(sizeof(struct abc))

试试


_________________
Everything that has a beginning has an end.


页首
 用户资料  
 
9 楼 
 文章标题 : Re: [郁闷]搞不懂的extern!
帖子发表于 : 2008-11-12 22:10 
头像

注册: 2007-01-21 15:48
帖子: 52
地址: 四川
送出感谢: 0 次
接收感谢: 1
ChloeRei 写道:
struct abc *a;

:em06 没有分配内存阿,于是初始化为null了

正解。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译