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),但是谁来释放它,肯定是操作系统或者编译器来释放,但是编译器根据
什么来释放,编译器肯定是根据什么来申请就什么来释放,所以必须是地址,所以为了方便编译器释放数组在栈中所申请的空间必须固定首地址指针的值。