一、序
之前在編程中時刻謹記數組或者指針的申明和定義要保持一致,即
/*數組定義與聲明*/
// 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 卻認爲是一個字符數組。