[郁闷]搞不懂的extern!

软件和网站开发以及相关技术探讨
回复
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

[郁闷]搞不懂的extern!

#1

帖子 cnkilior » 2008-10-14 14:44

最近在看一些开源代码,忽然发现使用了没有定义或初始化的变量,查之,原来是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 次。
头像
windwiny
帖子: 2254
注册时间: 2007-03-13 17:26

Re: [郁闷]搞不懂的extern!

#2

帖子 windwiny » 2008-10-14 15:38

代码: 全选

extern struct *a;
struct abc *a;
你的程序是这样? 能编译?
xyywll
帖子: 338
注册时间: 2008-05-24 1:24

Re: [郁闷]搞不懂的extern!

#3

帖子 xyywll » 2008-10-14 23:12

看 C Primer Plus 第12章
teebye
帖子: 8
注册时间: 2008-09-16 22:38

Re: [郁闷]搞不懂的extern!

#4

帖子 teebye » 2008-10-15 10:37

extern int a 表示外部变量


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

但是清不要放在头文件中

头文件只放宏,谢谢
xyywll
帖子: 338
注册时间: 2008-05-24 1:24

Re: [郁闷]搞不懂的extern!

#5

帖子 xyywll » 2008-10-15 12:54

teebye:
头文件当然可以放 extern, 你看看 /usr/include/time.h
头像
ChloeRei
帖子: 1021
注册时间: 2007-11-23 9:49

Re: [郁闷]搞不懂的extern!

#6

帖子 ChloeRei » 2008-10-15 23:02

struct abc *a;

:em06 没有分配内存阿,于是初始化为null了
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: [郁闷]搞不懂的extern!

#7

帖子 自由建客 » 2008-10-16 23:09

全局变量初始化为 0 等书上都有的。
关于 extern ,顺便卖弄卖弄我的说法:
当一个模块 2.o 引用另一模块 1.o 中的某个变量,不能 #include "1.h" ,只能在当前模块源码 2.c 的可视范围内用 extern 说明。因为 #include 是嵌入而不是引用。外部变量说白了就是在别的模块当中的变量。
注意,编译器只识源文件,不识头文件(那是预处理器的事),为什么必须要有 1.c 就不用解释了吧!
头像
CLOCKWORKHEART
帖子: 635
注册时间: 2007-11-05 19:26

Re: [郁闷]搞不懂的extern!

#8

帖子 CLOCKWORKHEART » 2008-10-21 22:19

a=(struct abc*)malloc(sizeof(struct abc*))
改成

代码: 全选

a=(struct abc*)malloc(sizeof(struct abc))
试试
Everything that has a beginning has an end.
头像
老蒋
帖子: 52
注册时间: 2007-01-21 15:48
来自: 四川

Re: [郁闷]搞不懂的extern!

#9

帖子 老蒋 » 2008-11-12 22:10

ChloeRei 写了:struct abc *a;

:em06 没有分配内存阿,于是初始化为null了
正解。
回复