C中的動態內存分配

在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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章