数组里存的是什么,还有指针指向字符串问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值