C语言之动态内存分布

来源:互联网 发布:网络语打卡的意思 编辑:程序博客网 时间:2024/06/05 07:41
作用域 { 局部变量 }
不被计算机应用程序主动收回的存储空间
目的是为了提高计算机的运行效率
一、存储区划分

高(内存地址大)          栈区  
                                       堆区
       ��                           静态区
                                       常量区
低(内存地址小)          代码区

所有在栈区的内存都在计算机主动分配和主动收回
堆区的内存是由程序员主动分配和主动收回的,不会被计算机应用空间主动分配及收回
静态区和常量区不会受到应用程序和程序员的管辖
代码区是计算机在编译完后存储一条命令

单项值传递 只能往下传,传递的是值 和内存有关系 并不是传完就释放
常量区:

char *string =“iPhone ”  string[0] = ‘a’  运行崩溃
‘a‘字符常量   5整形常量 ’“iPhone”字符串常量

char s[ ] = “iphone”
s[ 0] = “a”

char *52 ={‘i’,’p’,’h’,}
s2[0] = ‘a’

char *s3 = “iphone”
s3[0] = ‘a’,不能修改,运行崩溃
 
常量占用内存,只读状态,不能修改!!!
字符数组如果最后一位是\0那吗他就是字符数字变量

静态存储区:
static int a = 5;
static char string[255];

1.只初始化一次 
2.如果初始没给值,默认值为
3.只有程序退出才释放(永远存在
将变量定义的类型前加static则该变量存储在静态存储区

堆区:由计算机应用程序编写人员主动分配和主动收回
malloc等内存分配函数分配的内存
代码区:
所有的语句编译后会产生CPU指令存储在代码区


二、堆内存分配函数


void  *malloc(unsigned int size);
                                                                   
返回分配完的内存的首地址        需要分配的字节数,因是参数,可以写表达式  
                                                   可以根据需求运行期分配内存
 
void * 不确定数据类型的指针变量

??//str = “iphone”;(101,102,103) 错误的    不要写等于号

char *str = malloc(8);
   strcpy (str,”iphone”);
int *arr = malloc(4)
short *str = malloc(4)
arr分配一块内存放一个int型元素,sarr可存放两个short元素
student *p = malloc(sizeof(student));
student *p =  malloc(sizeof(student)*5);
分配一个结构体内存和分配一个结构体数组的内存
 
内存释放
void free(void *)
free函数的作用是释放内存,内存释放是标记删除


三、其他的内存分配函数
calloc:
void *calloc(unsigned n,unsigned size);
分配n个size大小的空间,并且把该内存上的所有字节清零。
realloc:
void *realloc(void *p,unsiguned newSize);
给定的地址以及给定的大小重新分配

四、内存操作函数

char *s =”1234“;
int value = atoi(s);结果能转化成整型

初始化内存
void *memset(void *s,int c,size_t n)
从s指向的内存开始初始化n个字节的内容为c
   
内存拷贝
void *memcpy(void *dest,const void * source,size_t n)
从source指向的内存开始拷贝到dest,拷贝n个字节

内存比较:
int memcmp(const void *buf1, const void *buf2, unsigned int count) 
比较buf1和buf2指向的内存是否相同,比较count个字节

0 0