Microsoft PowerPoint - STU_C_Lang_CH13.ppt

Similar documents
C/C++基礎程式設計班

資料結構之C語言重點複習

C++ 程式設計

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft PowerPoint - 04-array_pointer.ppt

untitled

Microsoft PowerPoint - Class5.pptx

C 語言—陣列及字串

Microsoft Word - part doc

Microsoft Word - ¤W½Ò¤º®e RTF

Microsoft Word - ACL chapter02-5ed.docx

CC213

新・明解C言語入門編『索引』

C. p->data.a D. p.data.a 5 若需建立如圖所示的儲存結構, 以下正確的語法組是 : G q p c A. char **q, *p, c; p=&c; q=*p; C. char **q, *p, c; p=&c; q=&p; B. char *q, *p, c; p=&c;

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

Microsoft PowerPoint - 13_指標、資料傳遞2.pptx

PowerPoint Presentation

PowerPoint Presentation

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

Microsoft Word - chap05.doc

Excel VBA Excel Visual Basic for Application

PowerPoint Presentation

<4D F736F F F696E74202D FB5F8B3A5A142B8EAAEC6B6C7BBBCA142BB50C0C9AED7BEDEA7402E >

CC213

c_cpp

untitled

運算子多載 Operator Overloading

Microsoft PowerPoint - Bronson-v3-ch07.ppt [相容模式]

epub 33-8

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

Microsoft Word - 投影片ch03

Microsoft PowerPoint - ICP_02_Basic_Data_Type.ppt [相容模式]

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

C/C++语言 - C/C++数据

C 1

第3章.doc

Searching and Sorting

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

!194 課程 大綱 陣列介紹 [P.195] 陣列的使 用 [1] - 多個同型變數 [P.196] 陣列的初始化 [P.198] 陣列的使 用 [2] - 循序存取 [P.199] 陣列的使 用 [3] - 隨機存取 [P.200] 陣列的複製 [P.203] 在函式間傳送陣列 [P.204]

Microsoft Word - About_C_PointerAdvanced.doc

untitled

jQuery實戰手冊

untitled

Microsoft PowerPoint - pl_4.ppt

untitled

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

105 學 年 度 臺 中 市 立 國 民 中 學 藝 術 才 能 舞 蹈 班 學 生 招 生 暨 鑑 定 重 要 程 序 日 程 表 項 目 重 要 日 期 重 要 工 作 事 項 辦 理 單 位 簡 章 公 告 105 年 3 月 簡 章 暨 報 名 表 請 自 行 於 各 承 辦 網 站 下

臺北市立百齡高級中學九十二學年度第一學期代理教師甄選辦法草案

第九屆全國環境保護模範社區優良事蹟.PDF

Microsoft PowerPoint - Class2.pptx

untitled

新版 明解C++入門編

陣列與鏈結串列 Array and Linked List

untitled

净 利 润 和 扣 除 非 经 常 性 损 益 后 归 属 于 母 公 司 股 东 的 净 利 润 分 别 为 亿 元 和 亿 元 ; 3 假 设 本 公 司 2016 年 扣 除 非 经 常 性 损 益 前 归 属 于 母 公 司 股 东 的 净 利 润 分 别 为 6

游戏攻略大全(五十六).doc

牧 者 心 聲 要 因 心 懷 平 而 作 惡 要 謹 慎 言 行 免 得 舌 頭 犯 罪 ; 惡 人 時 候 要 用 嚼 環 勒 住 口 ( 詩 三 十 九 1) 今 天 社 會 和 教 會 裏 極 其 渴 望 人 能 以 具 體 行 動 勉 勵 走 善 良 正 直 路 作 好 榜 樣 ; 可 惜

Microsoft Word - ACG chapter00c-3ed.docx

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

jQuery實戰手冊

Microsoft Word - About_C_DynamicMemoryAllocation.doc

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

踏出C++的第一步

Microsoft Word - 4.doc

untitled

Microsoft PowerPoint - C-Ch11.ppt

Microsoft PowerPoint - 07-overloaded.ppt

C/C++基礎程式設計班

Microsoft PowerPoint - CH07 Arrays and Vectors [相容模式]

投影片 1

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

C/C++基礎程式設計班

本章內容 2-1 陣列及陣列位址的計算一維陣列位址計算多維陣列位址計算 2-2 一維陣列的基本運算讀取 寫入 複製 輸出 插入資料 刪除 2-3 二維陣列及矩陣的儲存與運算矩陣輸出 矩陣轉置 矩陣相加 矩陣相乘 2-4 字串 ( 字元陣列 ) 計算字串長度 字串複製 字串比較 子字串擷取 2

CC213

PowerPoint Presentation

The golden pins of the PCI card can be oxidized after months or years

C/C++基礎程式設計班

华恒家庭网关方案


2. 參考網站 C 語言考古題 & C 的解題 程式設計學習入門 ( 網址 : c.blogspot.com/) 網站 : 星子 ACM 小窩 ( 網址 : 網站 :ACM Onli

_汪_文前新ok[3.1].doc

C

C/C++ 语言 - 循环

Microsoft Word - 服装_hyc13_ doc

2015年计算机二级(C语言)模拟试题及答案(四)

C/C++ Programming

Explain each of the following terms. (12%) (a) O(n 2 ) (b) protected in C++ language (c) sparse matrix 7. Write

Microsoft PowerPoint - vb_net8

Microsoft Word - ch 校.doc

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ

( )... 5 ( ) ( )

附錄C.doc

p.2 1. a. b. c. (i) (ii)

C/C++ Basics

程式設計入門

個 人 的 手, 拉 著 瞎 子 的 手 把 他 帶 往 村 外 的 時 候, 對 於 瞎 子 來 講, 那 個 人 的 手 和 耶 穌 的 手 有 沒 有 區 別? 沒 有! 為 什 麼 沒 有 區 別? 因 為 對 於 一 個 瞎 子 來 說, 手 和 耳 朵 就 是 他 接 觸 世 界, 瞭

Microsoft PowerPoint - Class4.pptx

Transcription:

第 13 章 動態配置記憶體 程式設計與生活 - 使用 C 語言 Shi-Huang Chen Spring 2013 第 13 章 動態配置記憶體 13-1 記憶體配置函式 malloc( ) 13-2 動態配置結構陣列

配置記憶體 預估需求數量的範圍是一項不容易的學問 例 : 大到預估今年國家預算, 小到預估櫥窗裡展示的毛線衣, 需要多少磅毛線才能織成 撰寫程式時, 一樣無法預估程式執行所需的記憶體空間 例 : 輸入 n 個資料並儲存 如果宣告一個有 100 個元素的一維陣列來儲存 n 個資料, 會發生什麼現象呢? 當 n<100 時, 會閒置一些沒有使用到的記憶體空間 ; 當 n>100 時, 則預留的記憶體空間又不夠

動態配置記憶體模式 隨著問題範圍 ( 或大小 ) 的不同, 動態向系統要剛剛好的記憶體空間, 並在其不再需要時或程式結束前, 將其回收歸還系統, 使記憶體的空間充分被利用 13-1 記憶體配置函式 malloc( ) 函式名稱函式原型功能傳回原型宣告所在的標頭檔 malloc( ) void *malloc(size_t size); 說明 :malloc( 無號數整數變數或常數 size) 動態配置記憶體空間所配置記憶體空間的起始位址, 但目前此起始位址尚為未指定指向何種資料型態 stdlib.h

說明 malloc( ) 函式被呼叫時, 需傳入參數 (size), 它的資料型態為 size_t, 表示必須使用無號數整數變數或常數 malloc( ) 函式被呼叫時, 會配置 size 位元組的記憶體空間, 並傳回這個無資料型態的記憶體空間之起始位址 說明 ( 續 ) 由於不同資料型態的資料, 所佔記憶體空間大小也有所不同, 因此,size 可以設定成 sizeof( 資料型態 )* 幾個 例 : 動態配置兩個整數資料的記憶體空間, 則 size 設定為 2*sizeof(int) sizeof( 資料型態 ), 表示某資料型態所佔的記憶體空間

13-1-1 動態配置一維陣列 動態配置有 n 個元素的一維陣列之語法如下 : 資料型態 * 指標名稱 =( 資料型態 *) malloc(n * sizeof( 資料型態 )); 說明 因 malloc( ) 函式被呼叫時, 會傳回無資料型態的記憶體空間之起始位址, 所以必須宣告一個指標名稱來接收 語法中的每一個資料型態都必須相同 ( 資料型態 *) 表示將 malloc( ) 函式所配置記憶體空間的起始位址, 強制轉型為某資料型態的指標 malloc( ) 函式被呼叫時, 所配置空間並不會自動設定初值

例 : 動態配置有兩個元素的一維整數陣列 int *ptr = (int *) malloc(2 * sizeof(int)); [ 說明 ] 因 sizeof(int)=4, 所以動態配置了 2*4=8 個位元組 (int *) 表示將 malloc( ) 函式所配置記憶體空間的起始位址強制轉型為整數型態的指標 動態宣告的 ptr 雖然是整數指標變數, 也可以當一維整數陣列變數, 此時陣列元素為 ptr [0] 及 ptr[1] 範例 1: 寫一程式, 動態配置有兩個元素的一維整數陣列, 並將其元素的值設成 1 及 2 #include <stdio.h> #include <stdlib.h> int main() int *ptr = (int *) malloc(2 * sizeof(int)); *ptr=1; *(ptr+1)=2; printf("*ptr =%d\n", *ptr); printf("*(ptr+1)=%d\n", *(ptr+1)); free(ptr); // 回收動態配置的 ptr 陣列的記憶體 system("pause"); return 0; }

程式解說 (1) 第 6 列 ~ 第 10 列, 可以改成 ptr[0]=1; ptr[1]=2; printf("ptr[0]=%d\n", ptr[0]); printf("ptr[1]=%d\n", ptr[1]); 執行結果 ptr[0]=1 ptr[1]=2 (2) 回收一維動態陣列的語法如下 : free( 指標名稱 ); // 回收動態配置的記憶體 執行結果 *ptr=1 *(ptr+1)=2

13-1-2 動態配置二維陣列 動態配置二維陣列時, 必須從第一維陣列開始配置 第一維陣列所配置的記憶體, 主要是記錄 第二維陣列的起始位址 而第二維陣列才是儲存資料的記憶體位址 動態配置有 m*n 個元素的二維陣列之步驟如下 : 步驟 1. 配置第一維陣列, 其內容為一維指標陣列資料型態 ** 指標名稱 = ( 資料型態 **) malloc(m*sizeof( 資料型態 *)); 步驟 2. 配置第二維陣列, 其內容為一維陣列 for (i=0;i<m;i++) 指標名稱 [i]= ( 資料型態 *) malloc(n*sizeof( 資料型態 ));

說明 m 為第一維陣列的元素個數,n 為第二維陣列的元素個數 步驟中的每一個資料型態都必須相同 ( 資料型態 **) 表示 malloc( ) 函式所配置記憶體空間的起始位址, 強制轉型為某資料型態的指標, 並指定給第一維陣列 ( 資料型態 *) 表示 malloc( ) 函式所配置記憶體空間的起始位址, 強制轉型為某資料型態的指標, 並指定給第二維陣列 例 : 動態配置有 2*3 元素的二維單精確浮點數陣列 int i; float *ptr = (float **) malloc(2 * sizeof(float *)); for (i=0;i<3;i++) ptr[i]=(float *) malloc(3*sizeof(float));

說明 第一維陣列的元素有 2 個, 第二維陣列的元素有 3 個, 且 sizeof(float)=4, 所以動態配置了 2*3*4=24 個位元組 動態宣告的 ptr 雖然是單精確浮點數指標變數, 也可以當二維單精確浮點數陣列變數, 此時陣列元素為 ptr[0][0] ptr[0][1] ptr[0][2] ptr[1][0] ptr[1][1] 及 ptr[1][2] 範例 3: 寫一程式, 動態配置有 2*3=6 個元素的二維單精確符點數陣列, 並將其元素的值設成 1,2,3,4,5,6 #include <stdio.h> #include <stdlib.h> int main() int i,j; float k=1; float **ptr = (float **) malloc(2 * sizeof(float *)); for (i=0;i<3;i++) ptr[i]=(float *) malloc(3*sizeof(float)); for (i=0;i<6;i++) *(*ptr+i)=k; printf("*(*ptr+%d)=%.0f\n",i,*(*ptr+i)); k++; }

// 回收 ptr 陣列的第二維記憶體 for (i=0;i<2;i++) free(ptr[i]); free(ptr); // 回收 ptr 陣列的第一維記憶體 system("pause"); return 0; } 執行結果 *(*ptr+0)=1 *(*ptr+1)=2 *(*ptr+2)=3 *(*ptr+3)=4 *(*ptr+4)=5 *(*ptr+5)=6 程式解說 (1) 第 13 列中的 *ptr+i 代表從第二維陣列的起始記憶體位址, 移動 i 個 float 所佔的記憶體位址, 且 *ptr 表示第二維陣列儲存資料的記憶體位址 不可寫成 ptr+i, 因為其代表第一維陣列儲存資料的記憶體位址, 且一次移動 3*i 個 float 所佔的記憶體位址

(2) 第 11 列 ~ 第 17 列, 可以改成 for (i=0;i<2;i++) for (j=0;j<3;j++) ptr[i][j]=k; printf("ptr[%d][%d]=%.0f\n",i,j,ptr[i][j]); k++; } 執行結果 ptr[0][0]=1 ptr[0][1]=2 ptr[0][2]=3 ptr[1][0]=4 ptr[1][1]=5 ptr[1][2]=6

(3) 回收動態配置的二維陣列之記憶體時, 要特別注意回收的順序 回收時的順序剛好與配置時的順序相反, 即從高維陣列的記憶體往第一維陣列的記憶體 若從低維陣列的記憶體往高維陣列的記憶體, 這樣將失去指向高維的指標, 即不能再使用高維的指標 回收有 m*n 個元素的二維動態陣列之步驟如下 : 步驟 1. 回收動態配置的 ptr 陣列的第二維記憶體 for (i=0;i<m;i++) free( 指標名稱 [i]); 步驟 2. 回收動態配置的第一維陣列的記憶體 free( 指標名稱 );

13-2 動態配置結構陣列 動態配置有 n 個元素的一維結構陣列之語法 : struct 結構名稱 * 指標名稱 =(struct 結構名稱 *) malloc(n * sizeof(struct 結構名稱 )); 說明 (1) 因 malloc( ) 函式被呼叫時, 會傳回無資料型態的記憶體空間之起始位址, 所以必須宣告一個指標名稱來接收 (2) 語法中的每一個結構名稱都必須相同 (3) (struct 結構名稱 *) 表示將 malloc( ) 函式所配置記憶體空間的起始位址, 強制轉型為 struct 結構名稱的指標 (4) malloc( ) 函式被呼叫時, 所配置空間並不會自動設定初值

例 : 假設結構定義如下 struct student char name[9]; int age; char tel[11]; } 動態配置有 2 個元素的一維結構陣列 解 : struct student *ptr = (struct student *) malloc (2 * sizeof(struct student)); 說明 (1) 因 int 所佔的記憶體空間為 struct student 的成員變數中最大的, 且 sizeof(int)=4, 所以 sizeof(strut student)=ceil((float)9/4)*4+ ceil((float)4/4) *4+ceil((float)11/4)*4=28(12+4+12), 因此共動態配置了 2*28=56 個位元組 ( 參考 12-1-1 定義結構資料型態 ) (2) (strut student *) 表示將 malloc( ) 函式所配置記憶體空間的起始位址強制轉型為結構型態的指標 (3) 動態宣告的 ptr 雖然是結構指標變數, 也可以當一維結構陣列變數, 此時結構陣列元素為 ptr[0] 及 ptr[1]

範例 7: 寫一程式, 動態配置有兩個元素的一維結構陣列, 且結構定義如下 : struct student char name[9]; int age; char tel[11]; } 輸入一維結構陣列的成員資料並印出 #include <stdio.h> #include <stdlib.h> int main() int i; struct student char name[9]; int age; char tel[11]; }; struct student *ptr = (struct student *) malloc(2 * sizeof(struct student));

for (i=0;i<2;i++) printf(" 輸入第 %d 個學生的名字 :",i+1); scanf("%s",ptr->name); printf(" 年齡 :"); scanf("%d",&ptr->age); printf(" 電話 :"); scanf("%s",ptr->tel); printf(" 第 %d 個學生的名字 :",i+1); printf("%s ",ptr->name); printf(" 年齡 :"); printf("%d ",ptr->age); printf(" 電話 :"); printf("%s\n",ptr->tel); } system("pause"); return 0; } 執行結果 輸入第 1 個學生的名字 : 一郎年齡 :19 電話 :06-651 第 1 個學生的名字 : 一郎年齡 :19 電話 : 06-651 輸入第 2 個學生的名字 : 松板年齡 :18 電話 :04-239 第 2 個學生的名字 : 松板年齡 :18 電話 : 04-239