指针基础之字符串与堆区
一.指针与字符串
第一种形式:char *s="hello world"
定义一个字符指针进行初始化
这个操作是在静态区 申请了一块空间 制作伪常量(只读变量),只能读不能写,否则会报错
第二种形式:char arr[]="hello world"
定义一个字符数组进行初始化
s存储在静态区 arr存储在栈区
对于只能访问不能修改的区域 写操作会导致段错误或总线错误
如*s=‘t’;scanf("%s",s);会导致错误
而char *s1=arr;可以读写
二.堆区的概念
1.在堆区申请一块内存,可以用于数据存放
2.堆区的内存需要手动管理 即释放,如果申请的内存没有释放,会导致内存泄漏
3.返回值为void *类型,参数为需要申请的内存字节大小
void *类型是一个空指针类型,其可以表示可以使用任何数据类型,所以也称为万用指针
对于void*使用一定要进行强转
char *str=(char *)malloc(1024);
char 类型的指针申请一块1024字节的堆区空间,malloc返回值为void* 所以要强制转换为char*
free(str);
free 是对申请空间的释放操作的函数,这块空间可以供其他变量申请
注:此时str仍指向了这块区域此时是野指针非法访问
char *str1;
此时该指针未进行初始化,其内部可能存放的是一个地址数据,如果查找该地址,就会导致非法访问
如果该区域是不可访问的区域就会导致程序崩溃(段错误或总线错误)