0x1
原由
一直被字符串數組以及指向字符串指針所初的地址所困擾,然而今天第三次看c/c++安全編碼的
時候又遇見了這個問題,strlen(const char)所以我們要來思考以下這些周邊的問
0x2
問題
- 數組a[]中的a到底是什麼
- 數組a創建空間的存儲位置
- 在main創建的數組裏面存的是什麼 如a[2]
- 數組a[]=“abc” 與 p="abc"是否指向同一個地址
- ""與‘’的區別
0x3
解決方案!
#include<iostream>
int main(void) {
char a[] = "abcd";
const char *p = NULL;
//查看p和a是否使用同一個變量
p = "abcd";
printf("\na的地址%p", &a); //查看char const * a 的地址 --先假設a是一個指針
printf("\na的地址%p", a); //如果說數組a表示的是一個const指針,那麼
printf("\na第一個元素地址%p", *a);
printf("\n指針p指向的地址%p", p); //
printf("\n指針p的地址%p", &p);
printf("\n指針p的地址%p", *p);
printf("\n變量abcd的地址%p","abcd");
int sum1 = strlen("a");
//int sum2 = strlen('a'); 出錯,原因是'a'是char型
printf("\n\n\n\nsum1的數量%d 'a'", sum1);
a[2] = 'a';
printf("\n\n\n\n\na的地址%p", &a);
printf("\n指針p的地址%p", p);
printf("\n指針p的地址%p", &p);
printf("\n變量abcd的地址%p", "abcd");
return 0;
}
[運行結果]
0x4
解答
1.數組中是 char const * a;確定指向的地址爲某個初始值,然後裏面存是一個地址,全局變量區的地址,也就是a,b,c默認變量的地址
也就是說,數組申請了連續的空間,但是裏面存儲的卻是零散的數值。
2.創建的空間的存儲位置跟看它是什麼變量,如果是局部變量就在棧中
3. a[2]裏面存的是a 如果是&a[2]就是,&(a+2)的地址
4. 不是指向同一個地址,數組所指向的是a,b,c單獨的地址,而“abc”,纔是連續的地址。
5. “”就是表示創建一個const char 數組,' '代表着使用字符。
0x05
數組a[]與指針
其實a就是一個指針,只不過是一個char const*a ,所以
int main(void)
{
char * p1 = {0};
char a[] = {"asdf"};
p1 = a;
printf("p1[0] = %c",p1[0]); //輸出爲a
}
0x06
引出問題
1. 數組爲什麼必須是char const * a
我們知道,在c語言中內存分佈是非常重要的存在,而創建數組其實就是開闢一片空間,數組都是開闢在棧
中的這是自動完成的,所以不用我們進行free(a),但是誰來釋放它,肯定是操作系統或者編譯器來釋放,但是編譯器根據
什麼來釋放,編譯器肯定是根據什麼來申請就什麼來釋放,所以必須是地址,所以爲了方便編譯器釋放數組在棧中所申請的空間必須固定首地址指針的值。