中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

一個人做網(wǎng)站原型網(wǎng)絡(luò)推廣團(tuán)隊哪家好

一個人做網(wǎng)站原型,網(wǎng)絡(luò)推廣團(tuán)隊哪家好,贛州君拓網(wǎng)絡(luò)科技有限公司,北京 網(wǎng)站代運(yùn)營目錄 存在動態(tài)內(nèi)存分配的原因動態(tài)內(nèi)存函數(shù)mallocfreecallocrealloc 常見的動態(tài)內(nèi)存錯誤C/C程序的內(nèi)存開辟柔性數(shù)組柔性數(shù)組的特點柔性數(shù)組的使用柔性數(shù)組的優(yōu)勢 存在動態(tài)內(nèi)存分配的原因 內(nèi)存開辟方式,例如: int val 20;在??臻g上開辟四個字節(jié) char arr[10] { 0 …

目錄

  • 存在動態(tài)內(nèi)存分配的原因
  • 動態(tài)內(nèi)存函數(shù)
    • malloc
    • free
    • calloc
    • realloc
  • 常見的動態(tài)內(nèi)存錯誤
  • C/C++程序的內(nèi)存開辟
  • 柔性數(shù)組
    • 柔性數(shù)組的特點
    • 柔性數(shù)組的使用
    • 柔性數(shù)組的優(yōu)勢

存在動態(tài)內(nèi)存分配的原因

內(nèi)存開辟方式,例如:

int val = 20;在??臻g上開辟四個字節(jié)
char arr[10] = { 0 };在??臻g上開辟10個字節(jié)的連續(xù)空間

但是這種開辟空間的方式有兩個特點:

  1. 空間開辟大小是固定的
  2. 數(shù)組在申明的時候,必須指定數(shù)組的長度,它所需要的內(nèi)存在編譯時分配

但是有時候我們需要的空間大小,在程序運(yùn)行的時候才能知道
所以可以試試動態(tài)內(nèi)存開辟

動態(tài)內(nèi)存函數(shù)

動態(tài)內(nèi)存開辟在堆區(qū)
在這里插入圖片描述

malloc

void* malloc (size_t size);
size單位是字節(jié)
malloc(40);申請40個字節(jié)的內(nèi)存塊大小

頭文件為#include<stdlib.h>

這個函數(shù)向內(nèi)存申請一塊連續(xù)可用的空間,并返回指向這塊空間的指針

  1. 如果開辟成功,則返回一個指向開辟好空間的指針

malloc申請到空間后直接返回這塊空間的起始地址,不會初始化空間的內(nèi)容

	int i = 0;for (i = 0; i < 10; i++){printf("%d\n", *(p + i));}

打印出來的都是空間的起始地址

  1. 如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查
	if (p == NULL){perror("malloc");return 1;}

在檢測到參數(shù)(malloc)為NULL后,說明malloc無法開辟空間,繼續(xù)進(jìn)行下去會發(fā)生錯誤,則立刻調(diào)用perror函數(shù),將生成的錯誤描述將打印出來,后跟一個換行字符('\n')
在調(diào)用perror函數(shù)后,將程序停止,不再繼續(xù)進(jìn)行程序的運(yùn)行

  1. 返回值的類型是 void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時候使用者自己來決定
	int* p = (int*)malloc(40);

每次進(jìn)行p+1都會跳過一個int*類型

  1. 如果參數(shù) size 為0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器

在這里插入圖片描述

  1. malloc申請的內(nèi)存空間,當(dāng)程序退出時,還給操作系統(tǒng)
  2. 當(dāng)程序不退出,動態(tài)申請的內(nèi)存,不會主動釋放的
  3. 需要使用free函數(shù)來釋放

free

C語言提供了一個函數(shù)free,專門是用來做動態(tài)內(nèi)存的釋放和回收的

void free (void* ptr);

頭文件為#include<stdlib.h>

free函數(shù)用來釋放動態(tài)開辟的內(nèi)存

  1. 如果參數(shù) ptr 指向的空間不是動態(tài)開辟的,那free函數(shù)的行為是未定義的
  2. 如果參數(shù) ptr 是NULL指針,則函數(shù)什么事都不做
int main()
{int* p = (int*)malloc(40);//開辟失敗if (p == NULL){perror("malloc");return 1;}//開辟成功int i = 0;for (i = 0; i < 10; i++){printf("%d\n", *(p + i));}free(p);p = NULL;return 0;
}

釋放掉棧區(qū)的p指針,但是p仍然指向堆區(qū)的空間,但沒用了就會成為野指針,所以我們應(yīng)該主動將p置為空

calloc

C語言中calloc 函數(shù)也用來動態(tài)內(nèi)存分配
void* calloc (size_t num, size_t size);

  1. 函數(shù)的功能是為 num 個大小為 size 的元素開辟一塊空間,并且把空間的每個字節(jié)初始化為0
  2. 與函數(shù) malloc 的區(qū)別只在于 calloc 會在返回地址之前把申請的空間的每個字節(jié)初始化為全0。
  3. 頭文件為#include<stdlib.h>

在這里插入圖片描述
對申請內(nèi)存空間的內(nèi)容要求初始化,可以使用calloc函數(shù)來完成

realloc

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

  1. ptr 是要調(diào)整的內(nèi)存地址
  2. size 調(diào)整之后新大小(總共的內(nèi)存大小,包含原來內(nèi)存空間的大小)
  3. 返回值為調(diào)整之后的內(nèi)存起始位置。
  4. 這個函數(shù)在調(diào)整原內(nèi)存空間大小的基礎(chǔ)上,還會將原來內(nèi)存中的數(shù)據(jù)移動到新的空間
  • realloc函數(shù)的出現(xiàn)讓動態(tài)內(nèi)存管理更加靈活。
  • realloc函數(shù)可以做到對動態(tài)開辟內(nèi)存大小的調(diào)整

有時會我們發(fā)現(xiàn)過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時候內(nèi)存,我們一定會對內(nèi)存的大小做靈活的調(diào)整

realloc在調(diào)整內(nèi)存空間的是存在兩種情況

  1. 原有空間之后有足夠大的空間

擴(kuò)展內(nèi)存在原有內(nèi)存之后直接追加空間,原來空間的數(shù)據(jù)不發(fā)生變化

  1. 原有空間之后沒有足夠大的空間

在堆空間上另找一個合適大小的連續(xù)空間來使用,這樣函數(shù)返回的是一個新的內(nèi)存地址,realloc內(nèi)部操作步驟:

  1. 開辟新的空間
  2. 會將舊的空間中的數(shù)據(jù)拷貝到新的空間
  3. 釋放舊的空間
  4. 返回新空間的起始地址
    將起始地址放在一個新的變量中,防止開辟失敗將原有空間釋放且沒有新的空間地址

例如:

int main()
{int* p = (int*)malloc(40);//開辟失敗if (p == NULL){perror("malloc");return 1;}//開辟成功 初始化為1-10int i = 0;for (i = 0; i < 10; i++){p[i] = i + 1;}//增加新的空間int* ptr = (int*)realloc(p, 80);if (ptr != NULL){p = ptr;ptr = NULL;}else{perror("realloc");return 1;}//釋放空間free(p);p = NULL;return 0;
}
  1. 增加新的空間時,將增加完空間之后的起始地址放在一個新的指針變量(ptr)中
  2. 在確定增加的空間開辟成功后再將新開辟空間的地址(ptr)賦給原開辟的指針變量(p)中
  3. 將新的指針變量(ptr)置為NULL,防止最后釋放空間后變?yōu)橐爸羔?/li>
  4. 結(jié)束內(nèi)存空間分配后釋放空間(此時pptr所處的地址相同,釋放p指針的地址的同時ptr指針的地址相應(yīng)的也不存在),置為NULL

常見的動態(tài)內(nèi)存錯誤

  1. 對NULL指針的解引用操作
    錯誤示例:
    在這里插入圖片描述

  2. 對動態(tài)開辟空間的越界訪問
    錯誤示例:
    在這里插入圖片描述

  3. 對非動態(tài)開辟內(nèi)存使用free釋放
    錯誤示例:
    在這里插入圖片描述

  4. 使用free釋放一塊動態(tài)開辟內(nèi)存的一部分
    錯誤示例:
    在這里插入圖片描述

  5. 對同一塊動態(tài)內(nèi)存多次釋放
    錯誤示例:
    在這里插入圖片描述

  6. 動態(tài)開辟內(nèi)存忘記釋放(內(nèi)存泄漏)
    錯誤示例:
    在這里插入圖片描述
    忘記釋放不再使用的動態(tài)開辟的空間會造成內(nèi)存泄漏

動態(tài)申請的內(nèi)存空間,不會因為出了作用域自動銷毀(還給操作系統(tǒng))
只有兩種方式進(jìn)行銷毀:

  1. free
  2. 程序結(jié)束(退出)

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

在這里插入圖片描述
C/C++程序內(nèi)存分配的幾個區(qū)域:

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

棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。
棧區(qū)主要存放運(yùn)行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回數(shù)據(jù)、返回地址等

  1. 堆區(qū)(heap):一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收

分配方式類似于鏈表

  1. 數(shù)據(jù)段(靜態(tài)區(qū))(static)存放全局變量、靜態(tài)數(shù)據(jù)

程序結(jié)束后由系統(tǒng)釋放

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

static關(guān)鍵字修飾局部變量:

  1. 普通的局部變量是在棧區(qū)分配空間的,棧區(qū)的特點是在上面創(chuàng)建的變量出了作用域就銷毀
  2. 但是被static修飾的變量存放在數(shù)據(jù)段(靜態(tài)區(qū)),數(shù)據(jù)段的特點是在上面創(chuàng)建的變量,直到程序結(jié)束才銷毀,所以生命周期變長

柔性數(shù)組

在C99 中,結(jié)構(gòu)中的最后一個元素允許是未知大小的數(shù)組,這就叫做“柔性數(shù)組”成員

typedef struct st_type
{int i;int a[0];//柔性數(shù)組成員
}type_a;

若編譯器會報錯無法編譯,也可以寫成

typedef struct st_type
{int i;int a[];//柔性數(shù)組成員
}type_a;

int a[];int a[0]都成員是不確定的,表示為柔性數(shù)組

柔性數(shù)組的特點

  1. 結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少有一個其他成員
  2. sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存
struct S
{int n;int arr[0];
};
int main()
{printf("%d\n", sizeof(struct S));return 0;
}

打印結(jié)果為:4

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

柔性數(shù)組的使用

代碼1:

struct S
{int n;int arr[0];
};
int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);if (ps == NULL){perror("malloc");return 1;}ps->n = 100;int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i + 1;}//釋放free(ps);ps = NULL;return 0;
}

柔性數(shù)組成員arr,相當(dāng)于獲得了40個字節(jié)的連續(xù)空間

柔性數(shù)組的優(yōu)勢

柔性數(shù)組也可以用指針來代替
代碼2:

struct S
{int n;int* arr;
};
int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S));if (ps == NULL){perror("malloc->ps");return 1;}ps->n = 100;ps->arr = (int*)malloc(40);if (ps->arr == NULL){perror("malloc->arr");return 1;}int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i + 1;}//釋放free(ps->arr);ps->arr = NULL;free(ps);ps = NULL;return 0;
}

代碼1 和 代碼2 可以完成同樣的功能
但是柔性數(shù)組的實現(xiàn)有兩個好處:

  1. 方便內(nèi)存釋放

使用柔性數(shù)組,結(jié)構(gòu)體的內(nèi)存以及其成員要的內(nèi)存一次性就可以分配好,并返回一個結(jié)構(gòu)體指針,做一次free就可以把所有的內(nèi)存也給釋放掉

  1. 有利于訪問速度

連續(xù)的內(nèi)存有益于提高訪問速度,也有益于減少內(nèi)存碎片

http://www.risenshineclean.com/news/57201.html

相關(guān)文章:

  • 上海浦東新區(qū)建設(shè)和交通委員會網(wǎng)站網(wǎng)絡(luò)熱詞作文
  • 那個網(wǎng)站做境外自由行便宜電商營銷推廣方案
  • 怎么做有趣的視頻網(wǎng)站軟文范例200字
  • 做簡歷的網(wǎng)站有抖音seo關(guān)鍵詞排名技術(shù)
  • 網(wǎng)站建設(shè)與制作教程百度競價點擊價格
  • 婚慶公司網(wǎng)站搭建免費com域名申請注冊
  • 公司網(wǎng)站要怎么做正規(guī)電商培訓(xùn)班
  • 黑龍江電商網(wǎng)站建設(shè)廣州seo工程師
  • 杭州濱江網(wǎng)站建設(shè)公司整合營銷是什么
  • 河南手機(jī)網(wǎng)站建設(shè)公司哪家好seo網(wǎng)站關(guān)鍵詞排名軟件
  • 月嫂云商城網(wǎng)站建設(shè)百度廣告聯(lián)盟下載
  • 揚(yáng)州市江都區(qū)城鄉(xiāng)建設(shè)局網(wǎng)站愛站網(wǎng)關(guān)鍵詞排名
  • 中英版網(wǎng)站系統(tǒng)企業(yè)網(wǎng)絡(luò)推廣計劃書
  • 上海期貨配資網(wǎng)站開發(fā)上google必須翻墻嗎
  • 服務(wù)網(wǎng)絡(luò)營銷的含義太原seo推廣
  • 如何做跨境電商新手入門教程seo排名如何
  • 外包客服公司好做嗎首頁排名seo
  • 珠海市網(wǎng)站開發(fā)公司seo競價
  • 怎么做火短視頻網(wǎng)站seo門戶網(wǎng)價格是多少錢
  • 一個ip地址上可以做幾個網(wǎng)站今日新聞聯(lián)播
  • 做網(wǎng)站用什么語言要做網(wǎng)絡(luò)推廣
  • 海珠區(qū)有沒有專門做網(wǎng)站的地方全球最大的中文搜索引擎
  • 專業(yè)網(wǎng)站建設(shè) 公司哪家好杭州網(wǎng)站推廣與優(yōu)化
  • 網(wǎng)站推廣中應(yīng)注意哪些事項泉州seo技術(shù)
  • 做網(wǎng)站需要買seo中國是什么
  • 江蘇網(wǎng)站開發(fā)輿情分析網(wǎng)站免費
  • 偷拍網(wǎng)站做色盲測試圖第六版
  • 鄭州百度網(wǎng)站優(yōu)化排名百度賬號申訴
  • 如何建設(shè)網(wǎng)站效果好百度發(fā)布信息的免費平臺
  • 深圳市多語言網(wǎng)站建設(shè)公司廣州百度關(guān)鍵詞排名