c语言-动态内存分配
来源:互联网 发布:围堰稳定性计算软件 编辑:程序博客网 时间:2024/04/23 19:31
内存区域划分(地址由高到低)
//本节红色注释是在写的时候有模糊或忘记的地方,蓝色是该注意的地方
1.栈区
2.堆区
3.静态(全局区)
4.常量区
5.代码区
栈区:由系统分配,主要存一些局部变量(主要是定义在函数体内)这些内存在函数使用完后由系统释放,例如如下函数
void printAb (int a, int b);
void printAb(int a, int b){
print("%d %d", a, b);
}
如上述a, b在函数printAb调用完后,这样a,b便得到释放
注:栈区内的数据以栈的形式存储,栈的特点:先进后出
//栈区的函数返回栈区的数据,是不安全的;因为栈区的数据随着函数执行结束,也会由系统自动回收回去,不能够保证一直都能够使用
int comeBack() {
int x = 10;
return x;
}//不安全
静态全局区:全局变量和static修饰的变量都由系统在静态全局区内存放
静态变量是用static定义的变量
如:
for(int i = 0 ; i < 5; i++){
static int a = 1;
a++;
printf("%d ", a);
}
这样打印出的结果是2 3 4 5 6
注:用static修饰变量:存在于静态全局区, 只能被初始化一次, 若没有初始值,则默认为0
静态全局区的变量是在程序结束执行那时才得到释放,也是由系统自动分配,由系统分配.
常量区:主要存储一些常量,如2, 3,4,yu ,"fdfd"等等
char *p = "ios";
*p = 'a'//这是错的,指向常量区地址,修改的是常量区的地址,这是不允许的, 会发生崩溃的情况
注:常量区内的值只能读取,不能修改
代码区: 程序中的函数和语句被编译成cpu指令存在于代码区,代码区也是由系统控制
堆区:由开发人员手动申请,手动控制
分配内存的函数
void *malloc(size_t); 返回值为void *类型,这个被称作是泛类型,泛类型可以转换成任意一种指针类型,size_t是分配的字节数
int * p = malloc(sizeof(int)); p指向了一个分配一个整形大小的内存空间的首地址, p的地址是存在于栈区的,但是分配的地址是在堆区的,p里面存的时一个堆区的地址.
在使用完内存之后要记得释放
内存泄露:内存区域一直被占用,得不到释放
如下使用free(void *);
注:在释放内存之后,如上面的 free(p); 需要使指针指向NULL(避免野指针)即 p = NULL;
这种释放只是将该内存的标记设为可用,而没有清空里面的内容(如果该内存没有使用的时候标记为0,一旦被分配即设为1,这里做的只是使里面的1标志设为0).
void *calloc(n, size_t);
和malloc一样,都是申请内存,并且calloc申请内存后,会对内存里的内容做清空的操作;由于多了一步清空操作,效率要比malloc低. n:个数 size:字节数
calloc申请的内存字节数 = n * size;
eg: int *p6 = calloc(5, 4);
free(p6);
p6 = NULL;
void *realloc(p, size);
从p开始重新申请size个字节.
从地址p向后申请size个字节,如果后面可用的字节够的话,就申请内存,并返回当前的指针p;如果不够的话,会再去取内存中找一块连续的空间,如果找到,就返回这一块连续的空间的内存的首地址,并且把之前所占用的内存释放
int *p7 = malloc(2);
printf("%p\n", p7);
p7 = realloc(p7, 170);
printf("%p\n", p7);
以上是分配空间的还有如下几个函数
void *memset(p,c , n);//从指针p的位置初始化n个字节的内存,把内容改成c
void *memcopy( p1,p2, n );//从指针p2的位置,向p1的位置,拷贝n个字节的内容
int memcmp(p1, p2, n);//比较p1和p2指向的内存所存放的内容是否相同,比较n个字节,相同返回为0,不同返回差值
//栈区地址
int a = 3;
printf("&a = %p\n", &a);
//堆区地址
int *q = malloc(4);
printf("q = %p\n", q);
//静态全局区
printf("a1 = %p\n", &b);
static int a2 = 2;
printf("a2 = %p\n", &a2);
//常量区
char *string = "happy";
printf("string = %p\n", string);
//代码区
printHello();
- C语言动态内存分配
- C语言动态内存分配
- C语言动态内存分配
- C语言 动态内存分配
- C语言动态内存分配
- c语言:动态内存分配
- C语言-动态内存分配
- c语言-动态内存分配
- C语言动态内存分配
- C语言动态内存分配
- c语言 动态内存分配
- C语言-动态内存分配
- C语言动态内存分配
- C语言 动态内存分配
- C语言 动态内存分配
- C语言 动态内存分配
- 【C语言】动态内存分配
- 【C语言】动态内存分配
- Io 异常: The Network Adapter could not establish the connection
- stm32定时器时钟源问题
- java通过实体类名称获取对应的数据表名称
- uva10795(汉莫塔)
- NYOJ_68
- c语言-动态内存分配
- 关于messagebox的使用
- 分支-12. 计算火车运行时间(15)
- AXIS通过HTTPS(SSL加密)方式访问Webservice
- NYOJ 题目116士兵杀敌(二)
- GPT硬盘安装Win8.1 (64bit)+CentOS7 双系统
- MongoDB用户认证和权限
- linux下的source命令
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结