C語言動(dòng)態(tài)數(shù)組是指在聲明時(shí)沒有確定數(shù)組大小的數(shù)組,即忽略方括號(hào)中的下標(biāo);當(dāng)要用它時(shí),可隨時(shí)用內(nèi)存管理函數(shù)重新指定數(shù)組的大小。動(dòng)態(tài)數(shù)組的內(nèi)存空間是從堆(heap)上分配的,是在執(zhí)行代碼過程中分配的,當(dāng)程序執(zhí)行到這些語句時(shí),才為其分配。注意,程序員自己負(fù)責(zé)釋放內(nèi)存。 C語言提供了一些內(nèi)存管理函數(shù)來幫助我們來按需要?jiǎng)討B(tài)地分配和回收內(nèi)存空間,這些函數(shù)包括: - `malloc(size)`:在堆上分配一塊長(zhǎng)度為size字節(jié)的連續(xù)區(qū)域,并返回其首地址。 - `calloc(n, size)`:在堆上分配n塊長(zhǎng)度為size字節(jié)的連續(xù)區(qū)域,并返回其首地址。與malloc不同的是,calloc會(huì)將分配的空間初始化為0。 - `realloc(p, size)`:重新分配堆上的指針p所指的空間,使其長(zhǎng)度為size個(gè)字節(jié),并返回新的首地址。同時(shí)會(huì)復(fù)制原有內(nèi)容到新分配的空間。注意,size可大可?。ㄈ绻碌拇笮〈笥谠瓋?nèi)存大小,則新分配部分不會(huì)被初始化;如果新的大小小于原內(nèi)存大小,可能會(huì)導(dǎo)致數(shù)據(jù)丟失)。 - `free(p)`:釋放指針p所指的堆上的空間。 這些函數(shù)都需要包含`<stdlib.h>`頭文件。使用這些函數(shù)時(shí),需要注意以下幾點(diǎn): - 函數(shù)的返回值是`void*`類型,表示一個(gè)無類型或類型不確定的指針。我們可以用強(qiáng)制類型轉(zhuǎn)換的方法將其轉(zhuǎn)換為所需的類型,例如`int* p = (int*)malloc(sizeof(int) * n);`。 - 函數(shù)的返回值可能是NULL,表示內(nèi)存分配失敗。我們需要在使用指針之前檢查是否為NULL,并做相應(yīng)的異常處理。 - 分配的堆空間是沒有名字的,只能通過返回的指針找到它。我們不能對(duì)非動(dòng)態(tài)分配的存儲(chǔ)塊使用free,也不能對(duì)同一塊內(nèi)存區(qū)同時(shí)用free釋放兩次。 - 調(diào)用free時(shí), 傳入指針指向的內(nèi)存被釋放, 但調(diào)用函數(shù)的指針值可能保持不變, 因?yàn)閜是作為形參而傳遞給了函數(shù)。嚴(yán)格地說, 被釋放的指針值是無效的, 因?yàn)樗巡辉僦赶蛩暾?qǐng) 的內(nèi)存區(qū)。這時(shí)對(duì)它的任何使用便可能會(huì)帶來問題。 使用內(nèi)存管理函數(shù)構(gòu)建動(dòng)態(tài)數(shù)組時(shí),需要遵循以下原則: - 申請(qǐng)空間時(shí),從外層往里層,逐層申請(qǐng)。 - 釋放空間時(shí),從里層往外層,逐層釋放。 以二維整型數(shù)組`int arr[m][n]`為例,我們可以用以下代碼來構(gòu)建和釋放動(dòng)態(tài)數(shù)組: // 構(gòu)建二維動(dòng)態(tài)數(shù)組int m, n; // 數(shù)組大小int** arr; // 二維指針scanf('%d%d', &m, &n); // 輸入數(shù)組大小arr = (int**)malloc(sizeof(int*) * m); // 申請(qǐng)m個(gè)一維指針if (arr == NULL) { // 檢查是否申請(qǐng)成功 printf('內(nèi)存申請(qǐng)失??!\n'); exit(1);}for (int i = 0; i < m; i++) { arr[i] = (int*)malloc(sizeof(int) * n); // 申請(qǐng)n個(gè)整型數(shù)據(jù) if (arr[i] == NULL) { // 檢查是否申請(qǐng)成功 printf('內(nèi)存申請(qǐng)失??!\n'); exit(1); }}// 使用動(dòng)態(tài)數(shù)組for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf('%d', &arr[i][j]); // 輸入數(shù)組元素 }}for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf('%d ', arr[i][j]); // 輸出數(shù)組元素 }printf('\n');}// 釋放動(dòng)態(tài)數(shù)組for (int i = 0; i < m; i++) { free(arr[i]); // 釋放每一行的空間}free(arr); // 釋放指針數(shù)組的空間arr = NULL; // 將指針置為NULL,避免野指針 系列文章持續(xù)更新,如果覺得有幫助請(qǐng)點(diǎn)贊+關(guān)注! |
|