日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

c语言 12大于12么,【C语言】第十二章

發(fā)布時(shí)間:2025/3/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 12大于12么,【C语言】第十二章 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

8種機(jī)械鍵盤軸體對(duì)比

本人程序員,要買一個(gè)寫代碼的鍵盤,請(qǐng)問紅軸和茶軸怎么選?

為什么會(huì)出現(xiàn)動(dòng)態(tài)內(nèi)存分配

這個(gè)問題要結(jié)合數(shù)組來進(jìn)行討論。在C99之前的標(biāo)準(zhǔn)中,C語(yǔ)言中數(shù)組的定義要求必須給定常量的大小才能定義數(shù)組,也就是說數(shù)組變量的內(nèi)存空間在編譯時(shí)就已成定局,無法更改。那我們?nèi)绻胍暾?qǐng)一塊內(nèi)存空間,空間大小在運(yùn)行時(shí)才進(jìn)行確定該怎么做呢?這就要用到動(dòng)態(tài)的內(nèi)存分配了,這里的空間大小的確定是在運(yùn)行時(shí)才進(jìn)行確定的。

動(dòng)態(tài)內(nèi)存分配函數(shù)

malloc和free

在內(nèi)存的動(dòng)態(tài)分配中,首當(dāng)其沖最為重要的兩個(gè)函數(shù)就是malloc和free函數(shù),它們挑起了動(dòng)態(tài)內(nèi)存分配的大梁。

malloc函數(shù)負(fù)責(zé)向計(jì)算機(jī)申請(qǐng)一塊連續(xù)的內(nèi)存空間,并且返回指向該塊內(nèi)存的指針。

void* malloc(size_t size);

但是值得注意的是malloc所返回的指針的類型是void*型,所以在實(shí)際使用中我們往往要進(jìn)行牽制類型轉(zhuǎn)換將其轉(zhuǎn)換為我們想要的指針類型。關(guān)于這個(gè)函數(shù)還有以下幾點(diǎn)說明。

1、如果開辟空間成功則返回一個(gè)指向該空間的指針。

2、如果開辟空間失敗則返回NULL。

3、如果參數(shù)為0則是未定義行為。

4、返回類型為void*所以編譯器并不知道所開辟的空間的類型,由使用者決定。

既然開辟了空間,并且這個(gè)空間編譯器不會(huì)幫我們自動(dòng)將其釋放那么就必然要求我們?cè)谑褂猛戤吅髮⑵溽尫?#xff0c;不浪費(fèi)內(nèi)存空間不造成泄露,因此就出現(xiàn)了free函數(shù)。

void free (void* ptr);

1、如果參數(shù)ptr的不是動(dòng)態(tài)開辟的則行為是未定義的。

2、如果參數(shù)ptr == NULL則函數(shù)什么都不做。

malloc和free函數(shù)都在stdlib.h頭文件中。

以下舉一個(gè)動(dòng)態(tài)分配內(nèi)存并且釋放的例子。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38#include

#include

int main()

{

int n = 0;

printf("請(qǐng)輸入要分配的數(shù)組的內(nèi)存空間的大小:");

scanf("%d", &n);

int* array = (int*)malloc(sizeof(int) * n);

printf("分配成功!n");

printf("請(qǐng)給數(shù)組賦值:");

for(int i = 0; i < n; i++)

{

scanf("%d", &array[i]);

}

for(int i = 0; i < n; i++)

{

printf("%dt", array[i]);

}

printf("n");

free(array);

array = NULL;

printf("數(shù)組已經(jīng)釋放!n");

}

請(qǐng)輸入要分配的數(shù)組的內(nèi)存空間的大小:8

分配成功!

請(qǐng)給數(shù)組賦值:1

2

3

4

5

6

7

8

12345678

數(shù)組已經(jīng)釋放!

在以上這個(gè)例子中我們動(dòng)態(tài)地在程序運(yùn)行時(shí)對(duì)一個(gè)數(shù)組進(jìn)行了空間的分配,并且讓用戶對(duì)數(shù)組進(jìn)行了賦值,之后打印,數(shù)組使用完畢后我們又用free函數(shù)將其空間釋放。這是一個(gè)很簡(jiǎn)單但是很實(shí)用的動(dòng)態(tài)內(nèi)存分配的例子。在這個(gè)例子中要尤為記住的一點(diǎn)是我們?cè)谶M(jìn)行動(dòng)態(tài)的內(nèi)存分配后一定不能忘記在使用完畢后將內(nèi)存空間釋放,并且將指針賦值為NULL,這一點(diǎn)是十分關(guān)鍵的,否則將造成內(nèi)存泄漏和野指針,對(duì)程序造成很大的影響。

往往內(nèi)存泄漏不是我們忘記free而是不經(jīng)意間造成的,以下就是一個(gè)典型的內(nèi)存泄漏的例子。1

2

3

4

5

6

7

8

9#include

#include

int main()

{

int* p = (int*)malloc(sizeof(int));

p = (int*)malloc(sizeof(int));

free(p);

p = NULL;

}

這個(gè)例子中我們明明進(jìn)行了釋放卻也造成了內(nèi)存泄漏,這是因?yàn)槲覀兩暾?qǐng)了兩次內(nèi)存空間,但是用同一個(gè)指針來接收,只釋放了一次,因此造成了內(nèi)存的泄漏。因此我們?cè)趯?shí)際使用中牽扯動(dòng)態(tài)內(nèi)存分配的時(shí)候都一定要小心又小心。

calloc

C語(yǔ)言還提供了一個(gè)函數(shù)進(jìn)行動(dòng)態(tài)內(nèi)存分配。這個(gè)函數(shù)與malloc函數(shù)很相似,但是有一點(diǎn)不同的是這個(gè)函數(shù)會(huì)自動(dòng)進(jìn)行初始化。但是初始化有時(shí)候也不盡然全是好事,當(dāng)我們要申請(qǐng)一個(gè)特別大的空間時(shí),初始化會(huì)浪費(fèi)很多很多的時(shí)間。

void* calloc(size_t num, size_t size);

calloc的功能是分配num個(gè)大小為size的內(nèi)存空間,并將內(nèi)存空間初始化為0。舉個(gè)例子。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26#include

#include

int main()

{

int n = 0;

printf("請(qǐng)輸入數(shù)組長(zhǎng)度:");

scanf("%d", &n);

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

for(int i = 0; i < n; i++)

{

printf("%dn", array[i]);

}

free(array);

}

請(qǐng)輸入數(shù)組長(zhǎng)度:8

0

0

0

0

0

0

0

0

在以上這個(gè)例子中我們看到calloc確實(shí)可以進(jìn)行動(dòng)態(tài)內(nèi)存分配并且進(jìn)行了初始化,但是這也是又兩面性的。因此也要謹(jǐn)慎使用。

realloc

當(dāng)我們將內(nèi)存空間進(jìn)行動(dòng)態(tài)分配后我們?nèi)绻胍獢U(kuò)大我們分配的內(nèi)存該怎么做呢?我們可以分配一塊新的內(nèi)存然后將原來內(nèi)存中的數(shù)據(jù)再放到新的內(nèi)存中。但是在C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中為了方便已經(jīng)給我們準(zhǔn)備了這么一個(gè)擴(kuò)容函數(shù)realloc。

void* realloc(void* ptr, size_t size);

ptr是要調(diào)整大小的內(nèi)存空間,size是調(diào)整后的大小。至于計(jì)算機(jī)是怎么進(jìn)行擴(kuò)容的呢?這里要分兩種情況。

1、如果目標(biāo)內(nèi)存空間后面有足夠大小的空間則直接將后面的空間歸入目標(biāo)空間中即可。

2、如果目標(biāo)空間后面沒有足夠大小的空間則在內(nèi)存中重新尋找一片足夠大小的空間進(jìn)行開辟并且將原來的數(shù)據(jù)放入到新的空間中。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45#include

#include

int main()

{

int n = 0;

printf("請(qǐng)輸入數(shù)組的長(zhǎng)度:");

scanf("%d", &n);

int* array = (int*)malloc(sizeof(int) * n);

printf("請(qǐng)輸入目標(biāo)擴(kuò)容的大小:");

scanf("%d", &n);

array = (int*)realloc(array, n * sizeof(int));

printf("擴(kuò)容成功!n");

printf("請(qǐng)給數(shù)組賦值:");

for(int i = 0; i < n; i++)

{

scanf("%d", &array[i]);

}

printf("打印數(shù)組:");

for(int i = 0; i < n; i++)

{

printf("%dn", array[i]);

}

}

請(qǐng)輸入數(shù)組的長(zhǎng)度:5

請(qǐng)輸入目標(biāo)擴(kuò)容的大小:8

擴(kuò)容成功!

請(qǐng)給數(shù)組賦值:1

2

3

4

5

6

7

8

打印數(shù)組:1

2

3

4

5

6

7

8

以上這個(gè)例子我們成功對(duì)已經(jīng)分配的內(nèi)存空間進(jìn)行了擴(kuò)容。

常見動(dòng)態(tài)內(nèi)存錯(cuò)誤

1、對(duì)NULL指針的解引用操作。

2、對(duì)動(dòng)態(tài)開辟空間越界訪問。

3、對(duì)非動(dòng)態(tài)內(nèi)存使用free釋放。

4、釋放一塊動(dòng)態(tài)開辟內(nèi)存的一部分。

5、對(duì)同一塊內(nèi)存多次釋放。

6、動(dòng)態(tài)開辟內(nèi)存忘記釋放。

以上的錯(cuò)誤都是十分常見的,因此我們?cè)趯?duì)內(nèi)存進(jìn)行操作的時(shí)候一定要萬(wàn)分小心。

C/C++程序內(nèi)存開辟

在這里將詳細(xì)介紹下計(jì)算機(jī)內(nèi)存中的幾個(gè)區(qū)域。

1. 棧區(qū)(stack):在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些

存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有

限。 棧區(qū)主要存放運(yùn)行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回?cái)?shù)據(jù)、返回地址等。

2. 堆區(qū)(heap):一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收 。分配方式類似

于鏈表。

3. 數(shù)據(jù)段(靜態(tài)區(qū))(static)存放全局變量、靜態(tài)數(shù)據(jù)。程序結(jié)束后由系統(tǒng)釋放。

4. 代碼段:存放函數(shù)體(類成員函數(shù)和全局函數(shù))的二進(jìn)制代碼。

通常我們定義的變量都存在棧區(qū),動(dòng)態(tài)分配內(nèi)存時(shí)變量的空間都是在堆區(qū)上進(jìn)行分配的,堆區(qū)有著更大更充足的空間。由此一來我們對(duì)動(dòng)態(tài)內(nèi)存分配就有了更深的了解。

柔性數(shù)組

柔性數(shù)組是在C99中最新的語(yǔ)法,其允許在結(jié)構(gòu)體中最后一個(gè)成員是一個(gè)位置大小的數(shù)組,這就是柔性數(shù)組。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34#include

#include

typedef struct st_type

{

int i;

int a[];//柔性數(shù)組成員

}type_a;

int main()

{

type_a* p = (type_a*)malloc(sizeof(type_a) + sizeof(int) * 10);//為結(jié)構(gòu)體分配內(nèi)存空間

p->i = 0;

for(int i = 0 ;i < 10; i++)

{

p->a[i] = 0;

}

for(int i = 0; i < 10; i++)

{

printf("%dn", p->a[i]);

}

free(p);

}

0

0

0

0

0

0

0

0

0

0

在以上這個(gè)例子中我們使用了柔性數(shù)組,在使用柔性數(shù)組的時(shí)候我們要對(duì)結(jié)構(gòu)體進(jìn)行動(dòng)態(tài)內(nèi)存分配,并且分配的空間要大于結(jié)構(gòu)體除柔性數(shù)組外的空間。

柔性數(shù)組的特點(diǎn):

1、結(jié)構(gòu)體中柔性數(shù)組前面必須至少一個(gè)其他成員。

2、sizeof測(cè)量結(jié)構(gòu)體大小不包括柔性數(shù)組的大小。

3包含柔性數(shù)組的結(jié)構(gòu)體用malloc進(jìn)行內(nèi)存動(dòng)態(tài)分配,并且分配的內(nèi)存大于結(jié)構(gòu)體大小以適應(yīng) 預(yù)期大小。

總結(jié)

以上是生活随笔為你收集整理的c语言 12大于12么,【C语言】第十二章的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。