熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

程序編譯之mallocandrealloc

2022-06-13   來源: SQL語言 
首先看個問題程序(這裡用的是TC編譯器)
  #include stdlibh
  #include stdioh
  void main()
  {
  int *i;
  i=(int *)malloc(sizeof(int));
  *i=;
  *(i+)=;
  printf(%x|%d\ni*i);
  printf(%x|%di+*(i+));
  }
  輸出的結果是
  fc|
  fe|
  這個程序編譯通過運行正常說它有問題問題出在哪呢?
  
  首先通過malloc建了一個大小為的堆
  i指向的地址是fci+指向的地址是fc+sizeof(int)=fe
  但是地址fe是不受保護的因為它不是機器分配給i+隨時會被其他變量占用
  
  正確的做法是
  #include stdlibh
  #include stdioh
  void main()
  {
  int *i;
  i=(int *)malloc(sizeof(int));
  *i=;
  i=(int *)realloc(i*sizeof(int));
  *(i+)=;
  printf(%x|%d\ni*i);
  printf(%x|%di+*(i+));
  }
  realloc 可以對給定的指針所指的空間進行擴大或者縮小無論是擴張或是縮小原有內存的中內容將保持不變當然對於縮小則被縮小的那一部分的內容會丟失realloc 並不保證調整後的內存空間和原來的內存空間保持同一內存地址相反realloc 返回的指針很可能指向一個新的地址
  所以在代碼中我們必須將realloc返回的值重新賦值給 p :
  p = (int *) realloc (p sizeof(int) *);
  
  甚至你可以傳一個空指針()給 realloc 則此時realloc 作用完全相當於malloc
  int* p = (int *) realloc (sizeof(int) * ); //分配一個全新的內存空間
  
  這一行作用完全等同於
  int* p = (int *) malloc(sizeof(int) * );
  
  『附注TC編譯器裡sizeof(int)=VC裡面sizeof(int)=
  char型在兩個編譯器裡是一樣的都是個字節(位)』
  
  calloc與malloc相似參數nelem為申請地址的單位元素長度elsize為元素個數如:
  char* p;
  p=(char*)calloc(sizeof(char));
  這個例子與上一個效果相同
From:http://tw.wingwit.com/Article/program/SQL/201311/11184.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.