UE4 C 語言動態陣列

2021-09-27 00:01:37 字數 2429 閱讀 3541

[ue4]c 語言動態陣列

在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決於實際輸入的資料,而無法預先確定。對於這種問題,用靜態陣列的辦法很難解決。為了解決上述問題,c語言提供了一些記憶體管理函式,這些記憶體管理函式結合指標可以按需要動態地分配記憶體空間,來構建動態陣列,也可把不再使用的空間**待用,為有效地利用記憶體資源提供了手段。

動態陣列,是相對於靜態陣列而言。靜態陣列的長度是預先定義好的,在整個程式中,一旦給定大小後就無法改變。而動態陣列則不然,它可以隨程式需要而重新指定大小。動態陣列的記憶體空間是從堆(heap)上分配(即動態分配)的。是通過執行**而為其分配儲存空間。當程式執行到這些語句時,才為其分配。程式設計師自己負責釋放記憶體。

為什麼要使用動態陣列?

在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決於實際輸入的資料,而無法預先確定。對於這種問題,用靜態陣列的辦法很難解決。為了解決上述問題,c語言提供了一些記憶體管理函式,這些記憶體管理函式結合指標可以按需要動態地分配記憶體空間,來構建動態陣列,也可把不再使用的空間**待用,為有效地利用記憶體資源提供了手段。

動態陣列與靜態陣列的對比

對於靜態陣列,其建立非常方便,使用完也無需釋放,要引用也簡單,但是建立後無法改變其大小是其致命弱點!

對於動態陣列,其建立麻煩,使用完必須由程式設計師自己釋放,否則嚴重會引起記憶體洩露。但其使用非常靈活,能根據程式需要動態分配大小。

如何構建動態陣列

遵循原則

申請的時候從外層往裡層,逐層申請;

釋放的時候從裡層往外層,逐層釋放。

構建所需指標

對於構建一維動態陣列,需要一維指標;

對於二維,則需要一維,二維指標;

三維需要一,二,三維指標;

依此類推。

構建所需函式

(1)規定為 void * 型別,這並不是說該函式呼叫後無返回值,而是返回乙個結點的位址,該 位址的型別為void(無型別或型別不確定),即一段儲存區的首址,其具體型別無法確定,只有使 用時根據各個域值資料再確定。可以用強制轉換的方法將其轉換為別的型別。例如:double *pd=null; pd=(double *)calloc(10,sizeof(double));  表示將向系統申請10個連續的 double型別的儲存空間,並用指標pd指向這個連續的空間的首位址。並且用(double)對calloc( ) 的返回型別進行轉換,以便把double型別資料的位址賦值給指標pd。

(2)使用sizeof的目的是用來計算一種型別的占有的位元組數,以便適合不同的編譯器。

(3)由於動態分配不一定成功,為此要附加一段異常處理程式,不致程式執行停止,使使用者 不知所措。通常採用這樣的異常處理程式段: if(p==null) /* 或者if(!p)*/

(4)這四個函式標頭檔案均包含在中。

(5)分配的堆空間是沒有名字的 只能通過返回的指標找到它。

(6)絕不能對非動態分配儲存塊使用free。也不能對同一塊記憶體區同時用free釋放兩次。 如:free§;free§;

(7)呼叫 free() 時, 傳入指標指向的記憶體被釋放, 但呼叫函式的指標值可能保持不變, 因 為p是作為形參而傳遞給了函式。嚴格的講, 被釋放的指標值是無效的, 因為它已不再指向所申請 的記憶體區。這時對它的任何使用便可能會可帶來問題。

malloc與calloc的區別

對於用malloc分配的記憶體區間,如果原來沒有被使用過,則其中的每一位可能都是0;反之, 如果這部分記憶體空間曾經被分配、釋放和重新分配,則其中可能遺留各種各樣的資料。也就是說, 使用malloc()函式的程式開始時(記憶體空間還沒有被重新分配)能正常執行,但經過一段時間後(內 存空間已被重新分配)可能會出現問題,因此在使用它之前必須先進行初始化(可用memset函式 對其初始化為0),但呼叫calloc()函式分配到的空間在分配時就已經被初始化為0了。 當你在calloc()函式和malloc()函式之間作選擇時,你需考慮是否要初始化所分配的記憶體空 間,從而來選擇相應的函式。

具體構建方法

以三維整型陣列array[n1][n2][n3]為例。

先遵循從外層到裡層,逐層申請的原則:

最外層指標是array,它是個三維指標,所指向的是array,其為二維指標。所以給array

申請記憶體應:

array=(int***)calloc(n1,sizeof(int**));

次層指標是array,它是個二維指標,所指向的是array,其為一維指標。所以給array

申請記憶體應:

for(i=0;i複製**

當然,你可以把它們整合在一起為:

int i,j,k;

int n1,n2,n3;

int ***array;

scanf("%d%d%d",&n1,&n2,&n3);

array=(int***)calloc(n1,sizeof(int**));

for(i=0;i最後不要忘了釋放這些記憶體,這要遵循釋放的時候從裡層往外層,逐層釋放的原則。

for(i=0;i其餘維的如四維建立過程大同小異,這裡不再贅述。

UE4 C 使用反射

使用 ufunction rightfunc this findfunction fname text onrightmousepressed if rightfunc processevent rightfunc,nullptr 藍圖直接使用藍圖物件根據方法名取得方法 注意 onrightmous...

UE4C 建立列舉

目錄 一 目的 1 想 ue4使用c 建立列舉變數適用於c 與藍圖 二 參考 1 ue4使用c 建立列舉變數適用於c 與藍圖 三 注意 1 c 類最好是actor型別,發現gamemodebase型別我在場景中沒有找到 四 操作 1 新建actor的c 類mygamemodebase.h 1 myg...

Ue4C 程式設計 總結篇

通過前面的一系列文章,已經將遊戲的基礎組成要素已經講完了,當然,都是單機的,不涉及網路部分。通過前面的一系列文章,我想製作乙個簡單的遊戲demo也不難了吧。umg是製作遊戲介面乙個十分簡便,強大的模組,它是由封裝自slate。slate有興趣的可以看下官方文件,是純用 編寫介面的,我更喜歡視覺化的u...