C语言基础 内存区分与存储

来源:互联网 发布:51单片机和arm单片机 编辑:程序博客网 时间:2024/06/03 23:00

内存分区

分配:从高地址到低地址

 

栈 : 局部变量 , 内存是由系统管理

堆 : 存放对象 , 它由程序员自己申请释放, 它的内存需要程序员自己管理

全局区 : 存放全局变量与静态变量, 它由系统管理

常量区 : 用来存放常量, 内存它由系统管理 , 它是只读区

代码区 : 用来存放代码, 内存它由系统管理 , 它是只读区

 

动态存储区

         堆 : 动态存储区

         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.里面内容不可以修改 ,可以保证程序安全性

 



0 0