首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言extern有关问题

2012-10-18 
C语言extern问题,高手进两个源文件test.hC/C++ codeint a[ 5 ] { 1, 2, 3, 4, 5 }int *b atest.cC/C+

C语言extern问题,高手进
两个源文件
test.h

C/C++ code
int a[ 5 ] ={ 1, 2, 3, 4, 5 };int *b = a;


test.c
C/C++ code
#include<stdio.h>#include<stdlib.h>#include"test.h"int main( void ){    extern int *a;    extern int b[ ];    int x, y;    x = a[ 3 ];    y = b[ 3 ];    printf("2%d", x, y );    getchar( );}


编译没问题,运行的时候提示在 
x = a[ 3 ];
处产生了一个段违例,应该是数组越界了吧。请高手分析一下

[解决办法]
首先,我猜测楼主的用意 大概是想 在 .h 当中定义一个 全局的数组 以供其他程序访问吧,

1 lz 在.h 的头文件中 声明了两样东西:
int a[ 5 ] ={ 1, 2, 3, 4, 5 }; 你在声明了一个数组a,好,
站在计算机程序的角度来看:
计算机帮你在内存中开辟了一块区域,这块区域(的大小)可以存放五个int类型的变量 
这块内存它的名字叫a,注意:a代表了一整块内存区域,它也就是 a 的类型是 数组类型 它的空间是5*sizeof(int)
如果你打印出 a ,那么你将看到的是 整个数组的起始地址,当然了第一个元素存放的位置,就是从在起始地址的那个 字节单元开始存放的

int *b = a; 你声明了一个 指针类型的变量,名字叫b ,b可以存任何存放int 变量的地址,(b可以指向任何 装有int 类型的内存区域 )
b = a ; 你将整个数组的起始地址的值 假设是(0x8751) 告诉了b ,
其实b 并不知道 a是一个数组,他只知道有人给了他一个地址(就像门牌号一样),他只知道0x8751 这个位置是一个int类型的数

2 extern int *a; 同上 extern的 是一个指针。。。。。
extern int b[ ]; 你对计算机 说b是以个数组

。。。。。

总之如果你想用 x = a[ 3 ]; 要这样 a必须是一数组名 或int指针(其实你声明的时候就有问题)
 总之 你把 extern int *a; ---> 改为 extern int a[] ; 或 extern int a[5] 计算机会找到 test.h 中的那个 相同名称的数组(就是他自己了)
 这样就 对了

太累了 睡觉了 很多东西一下子说不清楚 ,lz 多练手把,还有 编程风格要改改。。。
鄙人 c 语言 用的时间不长,也是菜鸟 
以上愚见 仅供参考。 如有不正,还望高手不吝赐教 ^_^




热点排行