一、序
之前在编程中时刻谨记数组或者指针的申明和定义要保持一致,即
/*数组定义与声明*/
// file.c
char arr[] = "abcdef";
//file.h
char arr[];
/*指针定义与声明*/
// file.c
char *arr = "abcdef";
//file.h
char *arr;
但其中的缘由也一直没有去想、去想清楚,今天看到一篇文章https://blog.csdn.net/meng_lemon/article/details/80642938,提供了解答。这边也做一下记录,正如标题说讲,回归基础,了解底层。
二、核心知识点
无论声明与定义如何变化,需要记住的是声明和定义使用的是同一块空间。
比如 char * arr, 其代表指向字符串的指针,其变量值为一个地址,这个地址指向一个常量字符串;
char arr[],其代表一个字符数值,其对应一块字符空间;
而最终生成的可执行档或者map 存储的arr的含义是变量定义所代表的含义。
通过这些分析,可以看到这两者之间还是有差别的。
三、具体例子
[参见https://blog.csdn.net/meng_lemon/article/details/80642938]
3.1 定义为数组,声明为指针
/*test.c*/
char arr[] = "abcdef";
/*main.c*/
#include <stdio.h>
#include <stdlib.h>
extern char *arr; //声明
int main()
{
printf("%s\n", arr);
system("pause");
return 0;
}
其映射关系如下所示,
arr 实际是一块字符空间, 而main.c 中的arr 却认为是一个地址,所以错误地将字符数组的四个字节内容当做指针值,从而访问了错误的内容。
3.2 定义为指针,声明为数组
/*test.c*/
char *p = "abcdef";
/*main.c*/
#include <stdlib.h>
#include <stdio.h>
extern char arr[]; //这里只是说他是一个数组,不需要填写数组个数
int main()
{
printf("%s\n", p);
system("pause");
return 0;
}
其映射关系如下:
相似的,p实际是一个指针,指向字符串。 而main.c 中的p 却认为是一个字符数组。