1. 程式人生 > >第十二章(2)——記憶體管理、隨機數

第十二章(2)——記憶體管理、隨機數

本文部分參考https://blog.csdn.net/fireflylane/article/details/83660791

分配記憶體malloc()和free()

定義在stdlib.h中 malloc()函式接收一個引數:所需要的記憶體位元組數 該函式會自動找到合適的空閒記憶體塊,這樣的記憶體是匿名的,即malloc()分配記憶體,但是不會為其賦名,它返回動態分配記憶體塊的首位元組的地址。

double *ptd;
ptd=(double *) malloc(30*sizeof(double));

malloc()可能分配不到所需要的記憶體,這種情況下,該函式返回空指標,可以呼叫exit函式結束程式,標準提供了兩個返回函式,EXIT_SUCCESS表示普通的程式結束,EXIT_FAILURE表示程式異常中止

free()函式 該函式釋放malloc()分配的記憶體,free()引數針,指向由malloc()分配的一塊記憶體

malloc()與free要配套使用,不然當程式執行完,變數被銷燬,從而申請的空間無法訪問,就會發生記憶體洩漏

calloc()函式 接收兩個無符號整數作為引數,第一個引數是所需的儲存單元數量,第2個引數是儲存單元的大小(以位元組為單位) 與malloc()的區別 calloc()函式分配的記憶體會將所有的位置為0,而malloc是隨機垃圾資料,不初始化 變長陣列申請的空間會被自動釋放,不必使用free

volatile型別界定符 告知計算機,代理(而不是程式所在的程式)可以改變該變數的值,通常,它被用於硬體地址以及在其他程式或同時執行的執行緒中共享資料。

restrict型別界定符 允許編譯器優化某部分程式碼以更好地支援計算,它只能用於指標,表明該指標是訪問資料物件的唯一且初始的方式

_Atominc型別界定符

隨機函式

把檔案放在雙引號中而不是尖括號中,指示編譯器在本地查詢檔案,而不是在編譯器存放標準標頭檔案的位置去查詢檔案

/*這是一個模擬擲色子1800次的程式*/
#include <stdlib.h>
#include <time.h>
int main() 
{   int i;
    srand((unsigned)time(0)); 
    for (i=0;i<1800;i++)   printf("%d\n",rand()%6+1);
    return 0; 
}

庫函式中系統提供了兩個函式用於產生隨機數:srand()和rand()。 原型為: 函式一:int rand(void); 返回一個[0,RAND_MAX]間的隨機整數。 函式二:void srand(unsigned seed); 引數seed是srand()的種子,用來初始化srand()的起始值。 系統在呼叫rand()之前都會自動呼叫srand(),如果在srand()裡給引數seed指定了一個值(這裡指定的值是當前時間),那麼 rand()就會將seed的值作為產生偽隨機數的初始值;而如果使用者在rand()前沒有呼叫過srand(),那麼系統預設將1作為偽隨機數的初始值,如果初始值是此時的1或是其他定值,那麼每次rand()產生的隨機數序列都是一樣的,這也就是所謂的“偽隨機數”。

為了確保生成的隨機數為儘可能符合概率上的隨機,需要呼叫一個函式time() (是指返回自 Unix 紀元(January 1 1970 00:00:00 GMT)起的當前時間的秒數的函式,主要用來獲取當前的系統時間,返回的結果是一個time_t型別),這個函式包含在標頭檔案time.h裡,在生成隨機數的呼叫下需強制型別轉換為(unsigned)time(),後面一個括號中必須填入(unsigned)time(NULL)或(unsigned)time(0)。