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

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

企業(yè)網(wǎng)絡(luò)營(yíng)銷策劃方案范文免費(fèi)seo教程資源

企業(yè)網(wǎng)絡(luò)營(yíng)銷策劃方案范文,免費(fèi)seo教程資源,錢網(wǎng)站制作,建設(shè)局網(wǎng)站投訴他治愈了身邊所有人,唯獨(dú)沒有治愈他自己—超脫 csdn上的朋友你們好呀!!今天給大家分享的是動(dòng)態(tài)內(nèi)存管理 👀為什么存在動(dòng)態(tài)內(nèi)存分配 我們定義的局部變量在棧區(qū)創(chuàng)建 int n 4;//在棧上開辟4個(gè)字節(jié)大小int arr[10] { 0 };//在棧上開…

在這里插入圖片描述
他治愈了身邊所有人,唯獨(dú)沒有治愈他自己—超脫

csdn上的朋友你們好呀!!今天給大家分享的是動(dòng)態(tài)內(nèi)存管理

👀為什么存在動(dòng)態(tài)內(nèi)存分配

在這里插入圖片描述

我們定義的局部變量在棧區(qū)創(chuàng)建

    int n = 4;//在棧上開辟4個(gè)字節(jié)大小int arr[10] = { 0 };//在棧上開辟連續(xù)的40個(gè)字節(jié)大小

上述變量創(chuàng)建的特點(diǎn)
1. 空間開辟大小是固定的。
2. 數(shù)組在申明的時(shí)候,必須指定數(shù)組的長(zhǎng)度,它所需要的內(nèi)存在編譯時(shí)分配。
但是對(duì)于空間的需求,不僅僅是上述的情況。有時(shí)候我們需要的空間大小在程序運(yùn)行的時(shí)候才能知道,那數(shù)組的編譯時(shí)開辟空間的方式就不能滿足了

int main()
{int n;scanf("%d",&n);int arr[n];}

上述代碼只能在C99標(biāo)準(zhǔn)編譯器上才行,vs系列編譯器均不支持,那我們?cè)趺床拍茉谶\(yùn)行的時(shí)候,實(shí)現(xiàn)上述變長(zhǎng)數(shù)組的代碼呢??這時(shí)候就只能試試動(dòng)態(tài)存開辟了。

👀 動(dòng)態(tài)內(nèi)存函數(shù)的介紹

malloc

在這里插入圖片描述

函數(shù)功能:開辟內(nèi)存塊
參數(shù)size_t:需要申請(qǐng)的字節(jié)數(shù)
返回值:申請(qǐng)失敗返回空指針,申請(qǐng)成功返回指向申請(qǐng)?jiān)摽臻g首地址的指針
頭文件:stdlib.h
注意返回指針的類型是void*,這時(shí)候需要你把該指針強(qiáng)制類型轉(zhuǎn)化為你想要的類型,這樣方便訪問,以及解引用,malloc申請(qǐng)來的空間是連續(xù)的,但是多次malloc來的是不連續(xù)的


malloc的使用

int main()
{int*p=(int*) malloc(40);//申請(qǐng)了40個(gè)字節(jié),強(qiáng)制轉(zhuǎn)化為int*類型指針if (p == NULL)//如果返回空指針的話,申請(qǐng)失敗{perror("malloc:");//打印錯(cuò)誤信息return 1;//非正常退出}for (int i = 0; i < 10; i++){*(p + i) = i;//對(duì)每一個(gè)四個(gè)字節(jié)大小的元素賦值,這里*(p+i)的本質(zhì)就是p[i];printf("%d", *(p + i));//打印每個(gè)元素}return 0;//程序正常退出}

在這里插入圖片描述


free

在這里插入圖片描述

功能:釋放內(nèi)存塊
參數(shù):指針接收要釋放內(nèi)存塊的首地址
頭文件:stdlib.h
返回值:無(wú)

了解了這些之后,我們?cè)囈幌箩尫艅偛舖alloc來的內(nèi)存塊

int main()
{int i = 0;int*p=(int*) malloc(40);if (p == NULL){perror("malloc:");return 1;}for (int i = 0; i < 10; i++){*(p + i) = i;printf("%d", *(p + i));}free(p);//指針接收要釋放內(nèi)存塊的首地址p = NULL;//很有必要否則p為野指針return 0;}

在這里插入圖片描述
當(dāng)p所指向的申請(qǐng)的空間釋放時(shí),p指針指向隨機(jī)位置,p變成野指針。
如果我們不釋放動(dòng)態(tài)內(nèi)存申請(qǐng)的內(nèi)存的時(shí)候,程序結(jié)束,動(dòng)態(tài)申請(qǐng)內(nèi)存由操作系統(tǒng)自動(dòng)回收,如果不用free函數(shù)釋放申請(qǐng)好的空間,就會(huì)在程序運(yùn)行結(jié)束前一直存在于堆中,造成內(nèi)存泄漏

int main()
{while (1){malloc(1000);}return 0;}

在這里插入圖片描述
我是不知天高地厚的年輕人哈哈哈哈哈


calloc

在這里插入圖片描述

功能:申請(qǐng)一個(gè)數(shù)組在內(nèi)存中,并且初始化為0;
參數(shù):size_t num申請(qǐng)數(shù)組元素的個(gè)數(shù),size_t size每個(gè)元素的字節(jié)大小
返回值:申請(qǐng)失敗返回空指針,申請(qǐng)成功返回指向申請(qǐng)?jiān)摽臻g首地址的指針
頭文件:stdlib.h

calloc函數(shù)使用

int main()
{int i = 0;int*p=(int*) calloc(10,sizeof(int));//申請(qǐng)10個(gè)元素,每個(gè)元素字節(jié)大小4if (p == NULL)//如果返回空指針的話,申請(qǐng)失敗{perror("calloc:");//打印錯(cuò)誤信息return 1;//非正常退出}for (int i = 0; i < 10; i++){printf("%d ", *(p + i));//打印初始化的值}free(p);p = NULL;return 0;}

在這里插入圖片描述

malloc和calloc的區(qū)別:與函數(shù) malloc 的區(qū)別只在于 calloc 會(huì)在返回地址之前把申請(qǐng)的空間的每個(gè)字節(jié)初始化為全0
我們可以看看malloc有沒有先初始化

int main()
{int* p = (int*)malloc(40);//申請(qǐng)了40個(gè)字節(jié),強(qiáng)制轉(zhuǎn)化為int*類型指針if (p == NULL)//如果返回空指針的話,申請(qǐng)失敗{perror("malloc:");//打印錯(cuò)誤信息return 1;//非正常退出}for (int i = 0; i < 10; i++){printf("%d ", *(p + i));//打印每個(gè)元素}free(p);//指針接收要釋放內(nèi)存塊的首地址p = NULL;//很有必要否則p為野指針return 0;//程序正常退出}

在這里插入圖片描述

可以看到是未初始化的,放的隨機(jī)值


realloc

在這里插入圖片描述

功能:內(nèi)存塊的擴(kuò)容
參數(shù):第一個(gè)參數(shù)接收要擴(kuò)容內(nèi)存塊的首地址,擴(kuò)容后總字節(jié)大小(包括原來的字節(jié)大小)
頭文件:stdlib.h
返回值:在這里插入圖片描述
在這里插入圖片描述

realloc函數(shù)使用

int main()
{int* p = (int*)malloc(40);//申請(qǐng)了40個(gè)字節(jié),強(qiáng)制轉(zhuǎn)化為int*類型指針if (p == NULL)//如果返回空指針的話,申請(qǐng)失敗{perror("malloc:");//打印錯(cuò)誤信息return 1;//非正常退出}for (int i = 0; i < 10; i++)//循環(huán)打印擴(kuò)容前的元素{*(p + i) = i;printf("%d ", *(p + i));}int* ptr = (int*)realloc(p, 80);//原空間夠用ptr==p,不夠用的話ptr存放新地址if (ptr != NULL)//擴(kuò)容成功{p = ptr;//原空間夠用ptr==p,不夠用的話ptr存放新地址,重新將新地址給p}for (int i = 10; i < 20; i++)//擴(kuò)容后新空間的{*(p + i) = i;printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}

編譯運(yùn)行
在這里插入圖片描述


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

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

int main()
{int* p = (int*)malloc(1000);int i = 0;//if (p ==NULL)//{//	return 1;//}for (i = 0; i < 250; i++){*(p + i) = i;}free(p);p = NULL;return 0;
}

在這里插入圖片描述

當(dāng)malloc申請(qǐng)內(nèi)存失敗,p=NULL,i=0,相當(dāng)于給空指針解引用

解決辦法:對(duì)malloc函數(shù)返回值做出判斷

int main()
{int* p = (int*)malloc(1000);int i = 0;if (p ==NULL){return 1;}for (i = 0; i < 250; i++){*(p + i) = i;}free(p);p = NULL;return 0;
}

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

int main()
{int* p = (int*)malloc(100);int i = 0;if (p ==NULL){return 1;}for (i = 0; i <=25; i++)//越界訪問{*(p + i) = i;}free(p);p = NULL;return 0;
}

編譯運(yùn)行
在這里插入圖片描述
解決方法:人為檢查是否越界

修改:

int main()
{int* p = (int*)malloc(100);int i = 0;if (p ==NULL){return 1;}for (i = 0; i <25; i++)//=25變成<25{*(p + i) = i;}free(p);p = NULL;return 0;
}

3.對(duì)非動(dòng)態(tài)開辟內(nèi)存進(jìn)行free

int main()
{int a = 10;int* p = &a;free(p);p = NULL;return 0;
}

編譯運(yùn)行
在這里插入圖片描述

解決方案:你別手賤(🙂)


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

int main()
{int* p = (int*)malloc(100);if (p == NULL){return 1;}int i = 0;for (i = 0; i < 10; i++){*p = i;p++;}free(p);p = NULL;return 0;}

編譯運(yùn)行
在這里插入圖片描述

解決方案:別改變p指向的地址,或者用一個(gè)指針記錄申請(qǐng)內(nèi)存的首地址

plan1:

int main()
{int* p = (int*)malloc(100);if (p == NULL){return 1;}int i = 0;for (i = 0; i < 10; i++){*(p+i)= i;printf("%d ", *(p + i));}free(p);p = NULL;return 0;}

plan2:

int main()
{int* p = (int*)malloc(100);int* q = p;if (p == NULL){return 1;}int i = 0;for (i = 0; i < 10; i++){*p= i;printf("%d ", *p);p++;}free(q);q = NULL;return 0;}

5.多次free已經(jīng)釋放的內(nèi)存

int main()
{int* p = malloc(40);if (p == NULL){return 1;}free(p);free(p);p = NULL;return 0;
}

編譯運(yùn)行
在這里插入圖片描述
解決方案:別多次free已經(jīng)釋放的內(nèi)存(滑稽)


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

見上面


👀幾個(gè)經(jīng)典的筆試題

1

char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}

分析:定義一個(gè)char*str,讓他指向空,str接收GetMemory()函數(shù)返回來的地址,進(jìn)入GetMemory()函數(shù),return p,只能把p[]的首地址傳回去,而p[]是局部變量,出GetMemory(),p[]銷毀,當(dāng)你傳回去的時(shí)候,str接收的是野地址,str為野指針。打印不出來hello world
編譯運(yùn)行:在這里插入圖片描述


2.

void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}

分析:在這里插入圖片描述

3.

void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}

分析:在這里插入圖片描述

但是沒有free釋放內(nèi)存

運(yùn)行編譯
在這里插入圖片描述


4.

void main(void)
{
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}

分析:在這里插入圖片描述

運(yùn)行編譯
在這里插入圖片描述


👀 柔性數(shù)組

也許你從來沒有聽說過柔性數(shù)組(flexible array)這個(gè)概念,但是它確實(shí)是存在的。 C99 中,結(jié)構(gòu)中的最
后一個(gè)元素允許是未知大小的數(shù)組,這就叫做『柔性數(shù)組』成員

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

結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少一個(gè)其他成員。sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。
包含柔性數(shù)組成員的結(jié)構(gòu)用malloc ()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。

我們可以定義一個(gè)結(jié)構(gòu)體

struct pp {int a;int b[];};
int main()
{printf("%d", sizeof(struct pp));}

編譯運(yùn)行
在這里插入圖片描述

確實(shí)沒有包括柔性數(shù)組大小

柔性數(shù)組的使用

struct pp {int a;int b[];//柔性數(shù)組成員
};
int main()
{struct pp* p = (struct pp*)malloc(sizeof(struct pp) + 10 * sizeof(int));//malloc中第一個(gè)元素大小+柔性數(shù)組字節(jié)大小p->a = 4;//賦值for (int i = 0; i < 10; i++){p->b[i] = i;//賦值}for (int i = 0; i < 10; i++){printf("%d ", p->b[i]);//打印柔性數(shù)組}printf("%d ", p->a);free(p);//free掉malloc來的空間p = NULL;//p置為空指針}

我們能不能用指針代替那個(gè)柔性數(shù)組呢,我們可以將指針指向的那個(gè)地方malloc來使用
定義一個(gè)結(jié)構(gòu)體

struct pp {int a;int* p;
};

int main()
{struct pp* q = (struct pp*)malloc(sizeof(struct pp));//申請(qǐng)結(jié)構(gòu)體大小的內(nèi)存if (q == NULL)//判斷申請(qǐng)是否成功{return 1;//異常退出}q->p = (int*)malloc(10*sizeof(int));if (q->p == NULL)//判斷申請(qǐng)是否成功{return 1;//異常退出}q->a = 10;//賦值for (int i = 0; i < 10; i++){q->p[i]= i;賦值}printf("%d ", q->a);for (int i = 0; i < 10; i++){printf("%d ", q->p[i]);}free(q->p);//free掉p指針指向的另一塊申請(qǐng)空間的內(nèi)存q->p = NULL;//指針置空,防止野指針free(q);//free掉q指向的申請(qǐng)的內(nèi)存q = NULL;}

分析:

malloc過程在這里插入圖片描述
釋放過程
在這里插入圖片描述
編譯運(yùn)行
在這里插入圖片描述

上述 代碼1 和 代碼2 可以完成同樣的功能,但是 方法1 的實(shí)現(xiàn)有兩個(gè)好處: 第一個(gè)好處是:方便內(nèi)存釋放
如果我們的代碼是在一個(gè)給別人用的函數(shù)中,你在里面做了二次內(nèi)存分配,并把整個(gè)結(jié)構(gòu)體返回給用戶。用戶調(diào)用free可以釋放結(jié)構(gòu)體,但是用戶并不知道這個(gè)結(jié)構(gòu)體內(nèi)的成員也需要free,所以你不能指望用戶來發(fā)現(xiàn)這個(gè)事。所以,如果我們把結(jié)構(gòu)體的內(nèi)存以及其成員要的內(nèi)存一次性分配好了,并返回給用戶一個(gè)結(jié)構(gòu)體指針,用戶做一次free就可以把所有的內(nèi)存也給釋放掉。
第二個(gè)好處是:這樣有利于訪問速度.
連續(xù)的內(nèi)存有益于提高訪問速度,也有益于減少內(nèi)存碎片,根據(jù)局部性原理,連續(xù)存放的數(shù)據(jù),cup從緩沖區(qū)讀取的快,緩存區(qū)從內(nèi)存中讀取的快。

總結(jié)

本片分享了四個(gè)動(dòng)態(tài)內(nèi)存函數(shù),以及常見動(dòng)態(tài)內(nèi)存錯(cuò)誤,幾個(gè)經(jīng)典的筆試題,以及柔性數(shù)組的概念,如果你覺得對(duì)你有幫助的話,希望能留下你的點(diǎn)贊,關(guān)注加收藏,如果有不對(duì)的地方,可以私信我,謝謝各位佬們!!!

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

相關(guān)文章:

  • wordpress 添加搜索引擎北京網(wǎng)絡(luò)seo
  • 三合一網(wǎng)站建設(shè)方案深圳市網(wǎng)絡(luò)營(yíng)銷推廣服務(wù)公司
  • b2b網(wǎng)站建設(shè)開發(fā)china東莞seo
  • 網(wǎng)站的服務(wù)有哪些seo外鏈工具有用嗎
  • 南陽(yáng)網(wǎng)站建設(shè)大旗電商電商網(wǎng)站訂煙
  • wordpress投訴功能qq群怎么優(yōu)化排名靠前
  • 多媒體網(wǎng)站開發(fā)實(shí)驗(yàn)報(bào)告做企業(yè)網(wǎng)站建設(shè)的公司
  • 網(wǎng)頁(yè)搜索工具新站seo優(yōu)化快速上排名
  • wordpress推廣升級(jí)vipseo做什么網(wǎng)站賺錢
  • 學(xué)網(wǎng)站建設(shè)怎么樣tool站長(zhǎng)工具
  • 網(wǎng)站的懲罰期要怎么做廣告安裝接單app
  • 國(guó)外設(shè)計(jì)網(wǎng)站dooor企業(yè)營(yíng)銷策劃書模板
  • 網(wǎng)站中qq跳轉(zhuǎn)怎么做的推廣公司經(jīng)營(yíng)范圍
  • 網(wǎng)站文化建設(shè)石家莊百度seo代理
  • 設(shè)計(jì)師論壇seo包年優(yōu)化
  • 做網(wǎng)站運(yùn)營(yíng)買什么電腦揚(yáng)州seo推廣
  • 銅仁建設(shè)集團(tuán)招聘信息網(wǎng)站seo快速優(yōu)化軟件網(wǎng)站
  • 做網(wǎng)站接項(xiàng)目seo網(wǎng)站是什么意思
  • 個(gè)人作品展示網(wǎng)站模板營(yíng)銷型網(wǎng)站策劃書
  • 做網(wǎng)站服務(wù)器在哪買微商引流人脈推廣軟件
  • 做一個(gè)網(wǎng)站維護(hù)多少錢快速排名新
  • 山西省住房建設(shè)廳網(wǎng)站房屋建筑定額北京seo關(guān)鍵詞優(yōu)化外包
  • 公司網(wǎng)站怎么做備案東莞疫情最新情況
  • 建站知識(shí)互聯(lián)網(wǎng)整合營(yíng)銷推廣
  • 各大網(wǎng)站圖片電商營(yíng)銷策劃方案范文
  • 什么是網(wǎng)站評(píng)價(jià)上海seo推廣服務(wù)
  • 深圳58同城網(wǎng)站建設(shè)百度廣告代理商加盟
  • 最新經(jīng)濟(jì)新聞?lì)^條新聞廈門seo怎么做
  • 汕頭市道路建設(shè)網(wǎng)站免費(fèi)seo優(yōu)化工具
  • 網(wǎng)站加速打開百度一下搜索一下