您的位置:首页 > 编程语言 > C语言/C++

C语言--定义为数组,声明为指针&定义为指针,声明为数组

2018-01-04 10:18 357 查看
1.定义为数组,声明为指针 

文件1中定义如下:

char a[100]="abcdef";

文件2中声明如下:

extern char* a;

这个时候编译器在编译的时候是分别编译的,在编译文件1时知道a是大小为100byte的数组,但是在编译文件2的时候,会认为a是char*的指针,大小为4

重点:在编译文件2的时候由于extern声明,编译器此时认为a是在其他文件中定义为了指针,此时就相当于在文件2看到的定义是char *a=abcd,这是因为指针大小是4,然后文件1中数组a[100]中存储的内容是前4个字节abcd,且此时编译器在编译文件2时认为文件1中的a是指针类型,而此时这个指针变量存储的内容是abcd。

因此这个时候文件2中的a中的值就是abcd,在取值*a的时候就是在地址值为abcd上的值,这个时候就会引出BUG,因此在声明与定义的时候要保证声明与定义的时候保持一致

避免这个问题需要清晰如下几个点:

a.有些编译器,在编译多个文件的时候是分开编译的,编译文件2的时候,文件2认为a的定义也是指针,而此时文件1中实际定义是数组,他的内存上已经存储了abcdef,文件2此时就误以为此时的地址值是abcd

b.数组char a[100]="abcdef",a拥有100个char类型的数组,其空间是100,数组a本身在栈上面,对a的元素的访问必须根据数组名a找到数组首元素的首地址,然后根据偏移量找到相应的值,“abcdef”就存储在以a为首元素首地址的内存当中

c.char* a,a本身在栈空间上占4个字节,a里面存储的是一块内存的首地址。这块内存在静态区

切记:数组与指针是有区别的

2.定义为指针,声明为数组

文件1中定义如下:

char *a="abcdef";

文件2中声明如下:

extern char a[100];

原理同上,此时在编译文件2的时候 认为定义的地方也是数组,而此时定义的地方确实指针,这个指针a的值为“abcdef”的首地址,大小为4字节,所以此时文件2中数组a中的元素值就是“abcdef”的首地址,且只有4个元素有值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: