我们什么时候应该使用动态内存
来源:互联网 发布:m2同比增速 数据 编辑:程序博客网 时间:2024/06/05 02:40
我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗??
该函数有几个作用:
1) 如果有足够的空间来扩充p的内存块,则返回一个指向p的指针;
2) 如果没有足够的空间来扩充p的内存块,则为p从新分配size的空间,并把原来的内容复制给p,指向p的开头,同时释放原来的空间,返回一个指向新内存块的指针;
3) 如果p=NULL,其作用于malloc()相似;
下面举一个程序的例子:
#define LONG 10
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
main()
{
char *message,buf[LONG];
gets(buf);
message=(char*)realloc(NULL,strlen(buf)+1);
strcpy(message,buf);
puts(message);
gets(buf);
message=(char*)realloc(message,(strlen(message)+strlen(buf)+1));
strcat(message,buf);
puts(message);
return 0;
}
既然有人会问这样的问题,那么我在这里好好的讲解一下吧!
首先让我们熟悉一下计算机的内存吧!在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str=”cgat”;其中”cgat”就储存在字符常量区里面;3)全局区:在全局区里储存一些全局变量和静态变量;4)堆:堆主要是通过动态分配的储存空间,也就是我们接下需要讲的动态分配内存空间。
同时当我们使用malloc()函数的时候还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它!如果我们不赋予|NULL行不行呢??答案是:不行的!如果我们不赋予一个空指针这样会导致原先的指针变量成为了一个野指针!何谓野指针?野指针就是一个没有明确指向的指针,系统不知道它会指向什么地方,野指针是很危险的,因此当我们每次使用完malloc()函数的时候都必须将指针赋予一个空指针!相对于malloc()函数,calloc()函数就不需要我们赋予NULL了,这是因为在每次调用完calloc()函数的时候系统会自动将原先的指针赋予一个空指针,即归于“0”。calloc()函数的原型是void *calloc(count,sizeof(类型名称));比如:p=(char*)calloc(4,sizeof(char));我们为p分配了指向char型指针的“4”个空间。
除了malloc()与calloc(),还有一个动态分配空间的函数realloc()函数,这个函数比前两个函数分配更多的空间,原型:void *realloc(void *p,size_t size);该函数有几个作用:
1) 如果有足够的空间来扩充p的内存块,则返回一个指向p的指针;
2) 如果没有足够的空间来扩充p的内存块,则为p从新分配size的空间,并把原来的内容复制给p,指向p的开头,同时释放原来的空间,返回一个指向新内存块的指针;
3) 如果p=NULL,其作用于malloc()相似;
下面举一个程序的例子:
#define LONG 10
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
main()
{
char *message,buf[LONG];
gets(buf);
message=(char*)realloc(NULL,strlen(buf)+1);
strcpy(message,buf);
puts(message);
gets(buf);
message=(char*)realloc(message,(strlen(message)+strlen(buf)+1));
strcat(message,buf);
puts(message);
return 0;
}
0 0
- 我们什么时候应该使用动态内存
- 我们什么时候应该使用异常
- 我们什么时候应该使用异常?
- PHP教程:我们什么时候应该使用异常?
- PHP相关系列 - 我们什么时候应该使用异常?
- 什么时候应该使用反射?
- 什么时候应该使用 ==?什么时候应该使用 Equals?
- 什么时候应该使用 ==?什么时候应该使用 Equals?
- 什么时候应该使用 ==?什么时候应该使用 Equals?
- 什么时候应该使用 ==?什么时候应该使用 Equals?
- 什么时候应该使用 ==?什么时候应该使用 Equals?
- 什么时候应该使用Web Service
- 什么时候应该使用Web Service
- 什么时候应该使用Web Service
- 什么时候应该使用Web Service
- 什么时候应该使用Web Service
- 什么时候应该使用Web Service
- 什么时候应该使用Web Service
- 并查集找gangs
- OCM_session0手动建库实验
- 安装使用RGBDSLAM_Freiburg
- Best of Vim Tips 中文版
- css和js学习的体会
- 我们什么时候应该使用动态内存
- 一个新的开始
- php连接mysql数据库
- HDU 2608 0 or 1 规律
- 强制提示走索引
- 函数内自动变量的返回
- linux进程间通信之Msgq
- Java华丽转身 —— J2EE规范(一) JNDI Java Naming and Directory Interface
- Cocos2d-x动作详解