内存分区
分配:从高地址到低地址
栈 : 局部变量 , 内存是由系统管理
堆 : 存放对象 , 它由程序员自己申请释放, 它的内存需要程序员自己管理
全局区 : 存放全局变量与静态变量, 它由系统管理
常量区 : 用来存放常量, 内存它由系统管理 , 它是只读区
代码区 : 用来存放代码, 内存它由系统管理 , 它是只读区
动态存储区
堆 : 动态存储区
1.它的内存由程序员管理
使用动态存储区
1.导入 stdlib.h
malloc(size_t size)
向操作系统申请堆中一块存储空间 , 如果操作分配成功, 就会返回这个存储空间的地址 , 否则返回NULL
2.free(void *);告诉操作系统这块存储空间不再使用了 ,
有一个malloc 就必须有一个free与之对应 , 否则造成内存泄露
释放过的指针就不可以再次释放 , 否则程序崩溃
int main()
{
//向操作系统申请内存
int *pi = malloc(sizeof(int)) // 申请内存空间
if(*pi != NULL)
*pi = 20;
printf(“%d\n”,*pi);
free(pi); //释放存储空间
printf(“%d\n”,*pi);
free(pi);
//清空后指针使用free不会有任何效果 ,
printf(“%d\n”,*pi);
return 0;
}
字符串存储
char *name[] = “nc”;
*name = ‘c’;
// 因为这个指针指向的时常量区字符串 , 所以它不能修改其所指向内容,它没有权限, 程序会在此处崩溃
charname[] = “xhh”;
//charname[] = {‘x’;’h’;’h’;’\0'};
char*words = “today”;
char*sb = “today”;
char*xx = “today”;
printf(“%p\n”,words);
printf(“%p\n”,sb);
printf(“%p\n”,xx);
//输出地址都一样
总结 :
字符数组存储的字符是在栈 , 栈是可读可写, 所以字符的呢荣可以任意的修改
使用char类型的指针定义字符串, 它是在常量区, 常量区是一个只读区 , 它所指向的内容是不可以修改的
使用场景:
当你定义的字符串中的内容在后面需要修改的时候就使用字符数组.
当定义的字符串不需要修改的时候就使用字符指针来定义字符串
1.常量区的东西无论使用多少次 , 在内存只有一份
2.效率高 , 省内存
3.里面内容不可以修改 ,可以保证程序安全性