C语言 extern 经常出错的一处

在一个 源文件里定义了一个 数组:char a[6];
在另外一个文件里用下列语句进行了声明:extern char *a;
请问,这样可以吗?
答案与分析:
1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的 指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。
2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x12345678 ( 数组的起始地址),而*a是重新定义了一个 指针变量,a的地址可能是0x87654321,直接使用*a是错误的.
3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。
4)、extern用在变量声明中常常有这样一个作用:你要在*.c文件中引用另一个文件中的一个全局的变量,那就应该放在*.h中用extern来声明这个全局变量。
在 C 语言中,可以通过 extern 关键字来声明一个全局变量或函数在另一个文件中定义,以便在当前文件中使用。 具体用法如下: 1. 在需要使用全局变量或函数的文件中,使用 extern 关键字声明该变量或函数: ``` extern int global_var; // 声明全局变量 extern void func(); // 声明函数 ``` 2. 在定义全局变量或函数的文件中,不需要使用 extern 关键字,直接定义即可: ``` int global_var = 0; // 定义全局变量 void func() { // 定义函数 // function body } ``` 3. 将上述两个文件编译为目标文件(例如 file1.o 和 file2.o),然后将它们链接起来生成可执行文件: ``` gcc -c file1.c -o file1.o gcc -c file2.c -o file2.o gcc file1.o file2.o -o program ``` 4. 在程序中使用全局变量或函数: ``` #include <stdio.h> extern int global_var; extern void func(); int main() { printf("global_var = %d\n", global_var); func(); return 0; } ``` 注意,在使用 extern 声明全局变量时,只是告诉编译器该变量在别的文件中已经定义了,但是并没有分配空间。因此,在定义全局变量时,需要在其中一个文件中进行实际的分配空间操作,否则链接时出错。例如: ``` // file1.c #include <stdio.h> int global_var; // 定义全局变量,并分配空间 int main() { global_var = 42; // 修改全局变量的值 printf("global_var = %d\n", global_var); return 0; } // file2.c #include <stdio.h> extern int global_var; // 声明全局变量 void func() { // 定义函数 printf("global_var = %d\n", global_var); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值