C中的动态内存分配

来源:互联网 发布:web数据挖掘 pdf 编辑:程序博客网 时间:2024/05/17 00:11

在C++中是使用new 和 delete 来进行动态内存分配的,尽量减少(或不用)下面C中动态内存分配在C++中的使用。

/*
 *动态内存分配的问题
 * 在C语言中用的是:
 *****(注意:malloc、calloc、realloc返回的值void* 类型,因此在使用时,要有显示的类型转换)
 *  void* malloc(size_t size)
 * 在堆内存中分配一块内存空间,存储空间大小size = sizeof(ElemType)*分配的元素个数,
 *返回那块空间的起始地址。但是值不确定,因此用函数 memset(地址,值(0),字节数),将所分配
 *的地址全部清零。
 *  void* calloc(size_t num,size_t size)
 * 在内存中分配一个数组,并将数组中的值初始化为 0;
 *  void* realloc(void* ptr,size_t size)
 * 释放旧地址空间,申请新地址空间,并且根据实际情况将旧空间的数据复制到新空间中,但是,
 *如果还有多余的空间,则这些新增的空间不保证清零。
 *
 * !!!在使用上述函数动态分配内存的时候,要注意判断所分配的内存是否为NULL或是不足!
 *
 * 既然在堆区中动态申请了内存,那么就得对应的要回收,用函数 void free(void* ptr),
 *其地址为malloc、calloc、realloc的返回地址(保存在对应的指针变量中)
 *
 * 在C++中用的是:
 *  new 和 delete
 */

#include <iostream>
using namespace std;

#include <cstdlib>

int main()
{
 // error: invalid conversion from ‘void*’ to ‘double*’ [-fpermissive]
 //因此,在使用时必须要显示的进行类型转换
 //double* pm = malloc(sizeof(double));

 double* pm = (double*)malloc(sizeof(double));
 //if(pm == NULL) exit(-1);
 cout << "pm = " << pm << endl;
 free(pm);
 
 int* pc = (int*)calloc(7,sizeof(int));
 cout << "pc = " << pc << endl;
 int i;
 for(i = 0; i != 7; i++)
  cin >> pc[i];  //如果用*pc++的话,那么pc的值会改变,那么在后面用pc值的话,就会出错
 /*for(i = 0; i != 7; i++)
  cout << *pc++ << ' ';*/
 for(int* p = pc; p != pc+7; p++)
  cout << *p << ' ';
 cout << endl;
 /*这这是将pc 所指向在堆区中动态分配的存储空间给释放掉了,
   但是pc还是指向这块空间,除非将pc 设置为NULL*/
 //free(pc);   pc = NULL;
 //cout << pc << endl;

 pc = (int*)realloc(pc , sizeof(int)*10);
 cout << "pc = " << pc << endl;
 //cout << *pc << endl;
 for(i = 0; i != 10; i++)
  cout << *(pc+i) << ' ';
 cout << endl;
 free(pc);

 return 0;
}

原创粉丝点击