本文共 5659 字,大约阅读时间需要 18 分钟。
指针动态初始化:
int *p = (int*)malloc(sizeof(int)*3);//初始化为指向3个元素的数组
if(!p) exit -1;//这个地方一定要进行判断,因为若动态初始化不成功,在使用p[0]、p[1]、p[2]时报错。 指针的销毁:free(p);
p = NULL;//避免p为野指针,需要赋值为NULL //p中的值仍为原先的内存地址,此时要进行赋值NULL。 //释放内存后,赋值为NULL的好处还有:当p为NULL时,即便再free n次也不会出错!!! 注意:free的含义:free之后,是将由malloc分配的内存交还给系统支配,而代码支配不了了,即由malloc分配的内存中内容由系统进行处理。其中存在两个值:一个是指针的值,指针的值并未发生改变,还是原先指向malloc分配的地址。
另一个是malloc分配的内存值,这其中的值取决于系统有没有使用该内存,如果使用了,该内存中的值会发生改变,如果没有使用,则还是保持原先的值。
总结:
初始化要判断内存是否申请成功; 销毁时要赋值NULL 。 //************************1、变量内存的动态分配(创建)与释放:通过指针,动态间接赋值、取值
指针变量名=new 数据类型(初始值); 初始值可省略,后边再赋值。
delete 指针变量名;
#includeusing namespace std;int main() { //int *p = new int; *p = 5; int *p = new int(5);//new运算符,动态创建一个int型变量(无变量名),值为5。 cout << *p;//输出所指地址的值 delete p;//释放指针变量的内存空间 return 0;}
2、一维数组的动态分配(创建)与释放:
指针变量名=new 数据类型[正整数常量、变量或表达式];
delete [ ]指针变量名;
#includeusing namespace std;int main() { int *p = new int[5];//new运算符,动态创建一个int型数组(无数组名)。 *(p + 1) = 10;//赋值第2个元素 //或p[1]=10; cout << p[1];//输出所指地址的值 delete []p;//释放指针变量数组的内存空间 return 0;}
显示Fibonacci数列的前N项,0,1,1,2,3,5,8,…
#includeusing namespace std;int main() { int N; cin >> N; int *p = new int[N]; //动态创建包含N个元素的数组 p[0] = 0; p[1] = 1;//给定第1、2元素的值,等效*p=0;*(p+1)=1; for (int i = 2; i < N; i++){ p[i] = p[i - 1] + p[i - 2]; } for (int i = 0; i < N; i++) { cout << p[i] << " "; } delete []p;//释放指针变量数组的内存空间 return 0;}
//************************
主要初步介绍malloc、free、calloc、realloc的基本。日后会有更详细的内容。
malloc、free分别用于动态内存分配和释放。
malloc会从内存池里提取一块合适的内存(连续的),并返回指向这块内存(起始位置的指针,该指针的类型为void*指针(因为malloc不知道你请求的内存需要存储的数据类型),而且这块内存并没有初始化。
如果操作系统无法提供给malloc足够的内存,malloc就会返回一个NULL指针。因此必须对每个从malloc返回的指针进行检查。
1 #include <stdio.h>
2 #include <stdlib.h> 3 4 int main() 5 { 6 int *pi; 7 int i; 8 pi = malloc(25 * sizeof( int )); 9 10 if( pi == NULL ) 11 { 12 printf( "Out of memory!\n" ); 13 exit(1); 14 } 15 16 for(i = 0; i != 25; i++) 17 pi[i] = i; 18 19 for(i = 0; i != 25; i++) 20 printf("%d ", pi[i]); 21 printf("\n"); 22 23 return 0;24 }
calloc也可以用于内存分配,但是返回指向内存的指针之前会初始化为0。而且calloc和malloc请求内存数量的方式也不一样。
realloc用于修改一个原先已经分配的内存大小。PS:若原来的内存块无法改变大小,realloc将分配另一块正确的小的内存,并把原来的那块内存的内容复制到新的内存块。
free函数的参数为一个先前从malloc、calloc、realloc返回的值。对NULL指针不会产生任何效果。
动态内存分配最常见的错误是忘记检查请求的内存是否分配成功。
《C与指针》里面提供了一个程序可以减少错误的内存分配器。
代码如下:
1 #include <stdlib.h>
2 3 #define malloc //用于防止由于其他代码块直接塞入程序而导致偶尔直接调用malloc 4 #define MALLOC(num, type) (type *)alloc((num) * sizeof(type))//接受元素的数目和类型,调用alloc函数获得内存,alloc调用malloc并进行检查,确保返回的指针不是NULL5 extern void *alloc( size_t size );
1 #include <stdio.h>
2 #include "alloc.h" 3 #undef malloc 4 5 void *alloc( size_t size ) 6 { 7 void *new_mem; 8 /* 9 * 请求所需的内存,并检查是否分配成功 10 */ 11 new_mem = malloc( size ); 12 if( new_mem == NULL ) 13 { 14 printf("Out of memory!\n" ); 15 exit(1); 16 } 17 return new_mem;18 }
1 #include <stdio.h>
2 #include "alloc.h"
3 4 int main() 5 { 6 int *new_memory; 7 int i; 8 9 /* 10 * 获得一个整型数组 11 */ 12 new_memory = MALLOC( 25, int ); 13 14 for(i = 0; i != 25; i++) 15 new_memory[i] = i; 16 17 for(i = 0; i != 25; i++) 18 printf("%d ", new_memory[i]); 19 printf("\n"); 20 return 0; 21 }转载地址:http://ogows.baihongyu.com/