国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

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

網(wǎng)站建設(shè)維護(hù)管理辦法外貿(mào)營(yíng)銷型網(wǎng)站制作公司

網(wǎng)站建設(shè)維護(hù)管理辦法,外貿(mào)營(yíng)銷型網(wǎng)站制作公司,哪些網(wǎng)站可做礦機(jī)期貨,wordpress怎么放圖片一、什么是內(nèi)存的動(dòng)態(tài)分配 全局變量分配在內(nèi)存中的靜態(tài)存儲(chǔ)區(qū)。局部變量(包括形參)分配在內(nèi)存中的動(dòng)態(tài)存儲(chǔ)區(qū),這個(gè)存儲(chǔ)區(qū)是一個(gè)稱為棧的區(qū)域。除此之外,C語(yǔ)言還允許建立內(nèi)存動(dòng)態(tài)分配區(qū)域,以存放一些臨時(shí)用的數(shù)據(jù)&…

一、什么是內(nèi)存的動(dòng)態(tài)分配

全局變量分配在內(nèi)存中的靜態(tài)存儲(chǔ)區(qū)。局部變量(包括形參)分配在內(nèi)存中的動(dòng)態(tài)存儲(chǔ)區(qū),這個(gè)存儲(chǔ)區(qū)是一個(gè)稱為的區(qū)域。除此之外,C語(yǔ)言還允許建立內(nèi)存動(dòng)態(tài)分配區(qū)域,以存放一些臨時(shí)用的數(shù)據(jù),這些數(shù)據(jù)不必在程序的聲明部分定義,也不必等到函數(shù)結(jié)束時(shí)才釋放,而是需要時(shí)隨時(shí)開辟,不需要時(shí)隨時(shí)釋放。這些數(shù)據(jù)是存放在一個(gè)特別的自由存儲(chǔ)區(qū),稱為區(qū)??梢愿鶕?jù)需要向系統(tǒng)申請(qǐng)所需大小的空間。由于未在聲明部分定義它們?yōu)樽兞炕驍?shù)組,因此不能通過變量名或數(shù)組名去引用這些數(shù)據(jù),只能通過指針來(lái)引用。
也就是說(shuō),全局變量分配于靜態(tài)存儲(chǔ)區(qū),局部變量分配于棧,動(dòng)態(tài)內(nèi)存分配在堆

二、怎樣建立內(nèi)存的動(dòng)態(tài)分配

對(duì)于內(nèi)存的動(dòng)態(tài)分配是通過系統(tǒng)提供的庫(kù)函數(shù)來(lái)實(shí)現(xiàn)的,主要有malloc,calloc,realloc,free這四個(gè)函數(shù)。

1.用malloc函數(shù)開辟動(dòng)態(tài)內(nèi)存

malloc的函數(shù)原型為:

void *malloc(unsigned int size);

malloc函數(shù)的作用是:
在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。形參size的類型定為無(wú)符號(hào)整型(不允許為負(fù)數(shù))。此函數(shù)的值(即“返回值”)是所分配區(qū)域的第一個(gè)字節(jié)的首地址,或者說(shuō),此函數(shù)是一個(gè)指針型函數(shù),返回的指針指向該分配域的第一個(gè)字節(jié)。如:

malloc(100);
//開辟100字節(jié)的臨時(shí)分配域,函數(shù)值為其第一個(gè)字節(jié)的地址。

注意指針的基類型為void,即不指向任何類型的數(shù)據(jù),只提供一個(gè)地址。如果此函數(shù)未能成功執(zhí)行(例如內(nèi)存空間不足),則返回空指針(NULL),失敗只有一種情況,就是申請(qǐng)的內(nèi)容太大,超出堆能提供的最大連續(xù)空間。

2.用calloc函數(shù)開辟動(dòng)態(tài)內(nèi)存

calloc的函數(shù)原型為:

void*calloc(unsigned n,unsigned size);

calloc的函數(shù)的作用是:
在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長(zhǎng)度為size的連續(xù)空間,這個(gè)空間一般比較大,足以保存一個(gè)數(shù)組。
用calloc函數(shù)可以為一維數(shù)組開辟動(dòng)態(tài)內(nèi)存存儲(chǔ)空間,n為數(shù)組元素個(gè)數(shù),每個(gè)元素長(zhǎng)度為size。這就是動(dòng)態(tài)數(shù)組。函數(shù)的指針指向所分配域的第一個(gè)字節(jié),此函數(shù)的值(即“返回值”)是所分配區(qū)域的第一個(gè)字節(jié)的首地址;如果不成功,返回空指針(NULL)。如:

p=calloc(50,4);
//開辟50個(gè)長(zhǎng)度為4個(gè)字節(jié)的臨時(shí)分配域,把首地址賦給指針變量p

calloc和malloc最大的區(qū)別為:申請(qǐng)完空間之后calloc會(huì)將每個(gè)元素的值直接置為0。

3.用realloc函數(shù)重新分配動(dòng)態(tài)內(nèi)存

realloc函數(shù)的原型:

void *realloc(void*p,unsigned int size);

參數(shù)的意義:p:舊內(nèi)存的地址;size:新申請(qǐng)的內(nèi)存大小,以字節(jié)為單位
realloc函數(shù)的作用是:
如果已經(jīng)通過malloc函數(shù)或calloc函數(shù)獲得了動(dòng)態(tài)內(nèi)存空間,想改變其大小,可以用realloc函數(shù)重新分配。用realloc函數(shù)將p所指向的動(dòng)態(tài)內(nèi)存空間的大小改變?yōu)閟ize。p的值不變。函數(shù)值成功返回時(shí)返回新的動(dòng)態(tài)內(nèi)存的首地址,如果重分配不成功,返回空指針(NULL)。失敗只有一種情況就是申請(qǐng)的內(nèi)容太大,超出堆能提供的最大連續(xù)空間。如:

realloc(p,50);
//將p指向的動(dòng)態(tài)內(nèi)存空間的大小改變?yōu)?0字節(jié)

用malloc實(shí)現(xiàn)realloc擴(kuò)容:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main()
{int n = 10;int *p=(int*)malloc(n * sizeof(int));assert(p != NULL);int i;for (i = 0; i < n; i++){p[i] = i;}for (i = 0; i < n; i++){printf("%d ", p[i]);}printf("\n");//1發(fā)現(xiàn)p申請(qǐng)的太少,于是重新申請(qǐng)int*q=(int *)malloc(2* n * sizeof(int));//1申請(qǐng)新內(nèi)存//2搬家for (i = 0; i < 2*n; i++){q[i] =i;}for (i = 0; i < 2*n; i++){printf("%d ", q[i]);}free(p);//3釋放p的內(nèi)存p = q;//4接收新內(nèi)存q = NULL;//...后面可以繼續(xù)使用preturn 0;	
}

在這里插入圖片描述
realloc實(shí)現(xiàn)擴(kuò)容:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main()
{int n = 10;int* p = (int*)malloc(n * sizeof(int));assert(p != NULL);int i;for (i = 0; i < n; i++){p[i] = i;}for (i = 0; i < n; i++){printf("%d ", p[i]);}printf("\n");//1發(fā)現(xiàn)p申請(qǐng)的太少,于是重新申請(qǐng)p = (int*)realloc(p, 2 * n * sizeof(int));for (i = 0; i < 2 * n; i++){p[i] = i;}//2搬家for (i = 0; i < 2 * n; i++){printf("%d ", p[i]);}//...后面可以繼續(xù)使用pfree(p);return 0;
}

在這里插入圖片描述

4.用free函數(shù)釋放動(dòng)態(tài)存儲(chǔ)區(qū)

free函數(shù)的原型:

void free(viod*p);

free函數(shù)的作用是:
釋放指針變量p所指向的動(dòng)態(tài)內(nèi)存空間,使這部分空間能重新被其他變量使用。p應(yīng)是最近一次調(diào)用calloc或malloc函數(shù)時(shí)得到的函數(shù)返回值。free函數(shù)無(wú)返回值。如:

free(p);
//釋放指針變量p所指向的已分配的動(dòng)態(tài)內(nèi)存空間

free崩潰的原因:
1.p移動(dòng)了(p++),因?yàn)樯暾?qǐng)p的時(shí)候有一個(gè)n的大小,如果p移動(dòng),找不到頭信息
2.找不到尾信息
3.重復(fù)釋放了一段內(nèi)存

以上4個(gè)函數(shù)malloc,calloc,realloc,free的聲明都在stdlib.h的頭文件中,在用到這些函數(shù)時(shí)應(yīng)該用#include<stdlib.h>指令把stdlib.h頭文件包含在程序文件中。

三、void指針類型

C99允許使用基類型為void的指針類型??梢远x一個(gè)基類型為void的指針變量(即void*型變量),它不指向任何類型的數(shù)據(jù)。
注意:不要把“指向void類型”理解為能指向“任何類型”的數(shù)據(jù),而應(yīng)理解為“指向空類型”或“不指向確定的類型”的數(shù)據(jù)。在將它的值賦給另一指針變量時(shí)由系統(tǒng)對(duì)它進(jìn)行類型轉(zhuǎn)換,使之適合于被賦值的變量的類型。
例如:

int main()
{int a = 3;   //定義a為整型變量int* p1 = &a;//p1指向int型變量char* p2;//p2指向char型變量void* p3;//p3為無(wú)類型指針變量(基類型為void型)p3 = (void*)p1;//將p1的值轉(zhuǎn)換為void*類型,然后賦值給p3p2 = (char*)p3;//將p3的值轉(zhuǎn)換為char*類型,然后賦值給p2printf("%d", *p1);//合法,輸出整型變量a的值void* p3 = &a; printf("%d", *p3);//錯(cuò)誤,p3是無(wú)指向的,不能指向a
}

說(shuō)明:
地址信息應(yīng)該包含位置信息和基類型的信息。 一定要注意基類型的信息,即存放存放在以此地址標(biāo)志的存儲(chǔ)單元中的數(shù)據(jù)類型,否則無(wú)法實(shí)現(xiàn)對(duì)數(shù)據(jù)的存取。所以對(duì)于void*類型的指針,這種指針無(wú)指向,在這種無(wú)指向的地址所標(biāo)志的存儲(chǔ)單元中是不可以存儲(chǔ)任何數(shù)據(jù)的,也就是說(shuō)無(wú)法通過這種地址對(duì)內(nèi)存存取數(shù)據(jù)。
什么情況下會(huì)用到void*類型的指針:
在調(diào)用動(dòng)態(tài)存儲(chǔ)分配函數(shù)(如malloc、calloc、realloc函數(shù))時(shí)會(huì)用到void*類型的指針。用戶用這些函數(shù)開辟動(dòng)態(tài)存儲(chǔ)區(qū)時(shí),希望獲得此動(dòng)態(tài)存儲(chǔ)區(qū)的起始地址,以便利用該動(dòng)態(tài)存儲(chǔ)區(qū)。
C99規(guī)定malloc、calloc、realloc函數(shù)返回void*指針,使其“無(wú)指向”,這種指針稱為“空類型指針”,它不指向任一種具體的數(shù)據(jù)類型,只提供一個(gè)地址。這是C有關(guān)地址應(yīng)用的一種特殊情況。
這種空類型指針在形式上和其他指針一樣,遵循C語(yǔ)言對(duì)指針的有關(guān)規(guī)定,它也有基類型,只是它的基類型是void,可以這樣定義:

void*p; //定義p是void*型的指針變量

void*型指針代表“無(wú)指向的地址”,這種指針不指向任何類型的數(shù)據(jù)。不能企圖通過它存取數(shù)據(jù),在程序中它只是過渡性的,只有轉(zhuǎn)換為有指向的地址,才能存取數(shù)據(jù)。

四、建立動(dòng)態(tài)內(nèi)存分配區(qū)和使用void指針

【例題】建立動(dòng)態(tài)數(shù)組,輸入5個(gè)學(xué)生的成績(jī),另外用一個(gè)函數(shù)檢查其中有無(wú)低于60分的,輸出不合格的成績(jī)。
【思路】用malloc開辟一個(gè)動(dòng)態(tài)自由區(qū)域,用來(lái)存放5個(gè)學(xué)生的成績(jī),會(huì)得到這個(gè)動(dòng)態(tài)域的第一個(gè)字節(jié)的地址,他的基類型是void型。用一個(gè)基類型是int的指針變量p來(lái)指向動(dòng)態(tài)數(shù)組的各元素,并輸出它們的值。但必須先把malloc函數(shù)返回的void指針轉(zhuǎn)換為整型指針,然后賦給p1。

#include <stdio.h>
#include <stdlib.h> //程序中用了malloc函數(shù),應(yīng)包含stdlib.h
void check(int* p)//定義check函數(shù),形參是int*指針
{printf("不合格的成績(jī)?yōu)?#xff1a;");for (int i = 0; i < 5; i++){if (p[i] < 60)printf("%d ", p[i]);//輸出不合格成績(jī)}printf("\n");
}
int main()
{int* p1 = (int*)malloc(5 * sizeof(int));  //p1是int型指針,開辟動(dòng)態(tài)內(nèi)存,將地址轉(zhuǎn)換為int*型,然后放在p1中for (int i = 0; i < 5; i++){scanf("%d", &p1[i]);//輸入5個(gè)學(xué)生的成績(jī)}check(p1);//調(diào)用check函數(shù)free(p1);return 0;
}

在這里插入圖片描述

五、斷言assert

一種比較保守的編程方式:每一次都要驗(yàn)證動(dòng)態(tài)申請(qǐng)內(nèi)存的返回值是否為空,這里就需要用到斷言assert,assert函數(shù)的聲明都在assert.h的頭文件中,在用到這個(gè)函數(shù)時(shí)應(yīng)該用#include<assert.h>指令把a(bǔ)ssert.h頭文件包含在程序文件中。
【例題】輸出n個(gè)連續(xù)自然數(shù)中的所有素?cái)?shù)

void Getprimer(int n)
{int* p = (int*)malloc(n * sizeof(int));//堆assert(p != NULL);for (int i = 0; i < n; i++){p[i] = 1;}p[1] = p[0] = 0;//0和1不是素?cái)?shù)for (int i = 2; i < n; i++){for (int j = i + 1; j < n; j++){if (j % i == 0)p[j] = 0;}}for (int i = 2; i < n; i++){if (p[i] == 1){printf("%d是素?cái)?shù)\n", i);}}free(p);
}
int main()
{int n;printf("請(qǐng)輸入n的大小:");scanf("%d", &n);Getprimer(n);return 0;
}
http://aloenet.com.cn/news/39287.html

相關(guān)文章:

  • 北京網(wǎng)站建設(shè)企業(yè)網(wǎng)站制作蘇州網(wǎng)站關(guān)鍵字優(yōu)化
  • 茂名網(wǎng)站制作百度推廣后臺(tái)登錄頁(yè)面
  • 做振動(dòng)盤的企業(yè)網(wǎng)站中國(guó)軍事新聞最新消息
  • 網(wǎng)站建設(shè)程序源碼青島網(wǎng)站優(yōu)化公司
  • flash做ppt的模板下載網(wǎng)站有哪些西安網(wǎng)站開發(fā)制作公司
  • 北京網(wǎng)站制作公司建站體驗(yàn)營(yíng)銷理論
  • 怎樣做網(wǎng)站-百度邯鄲今日頭條最新消息
  • 百度不收錄網(wǎng)站首頁(yè)女教師網(wǎng)課入侵錄屏冫
  • 企業(yè)做網(wǎng)站的申請(qǐng)報(bào)告廣州seo網(wǎng)絡(luò)推廣員
  • 離婚協(xié)議書模板 完整版海南seo代理加盟供應(yīng)商
  • 網(wǎng)站交互圖片怎么做的免費(fèi)搭建網(wǎng)站的軟件
  • 網(wǎng)站開發(fā)維護(hù)求職信全球十大搜索引擎排名
  • 網(wǎng)站建設(shè)的最新技術(shù)寧波seo優(yōu)化公司
  • 網(wǎng)絡(luò)代理是干嘛的重慶seo扣費(fèi)
  • 廣州站桂平網(wǎng)絡(luò)推廣
  • 宿遷建設(shè)局網(wǎng)站win7系統(tǒng)優(yōu)化
  • 禪城網(wǎng)站建設(shè)多少錢網(wǎng)絡(luò)營(yíng)銷推廣策劃的步驟是什么
  • 高端營(yíng)銷網(wǎng)站泰州百度公司代理商
  • 代做ppt網(wǎng)站百度知道在線問答
  • 網(wǎng)站靜態(tài)頁(yè)面網(wǎng)絡(luò)營(yíng)銷案例ppt
  • 鹽亭做網(wǎng)站采集站seo提高收錄
  • 研發(fā)一個(gè)app費(fèi)用seo百度發(fā)包工具
  • 深圳有做網(wǎng)站公司十大計(jì)算機(jī)培訓(xùn)學(xué)校
  • 綿陽(yáng)做網(wǎng)站優(yōu)化杭州百度開戶
  • 微信上的小說(shuō)網(wǎng)站是怎么做的做網(wǎng)絡(luò)推廣要學(xué)些什么
  • 找建設(shè)網(wǎng)站公司seo技術(shù)優(yōu)化服務(wù)
  • 合肥響應(yīng)式網(wǎng)站開發(fā)方案網(wǎng)絡(luò)推廣需要什么
  • 注冊(cè)過什么網(wǎng)站經(jīng)典軟文案例和扶貧農(nóng)產(chǎn)品軟文
  • 網(wǎng)站模塊是指什么地方石家莊線上推廣平臺(tái)
  • 網(wǎng)站建設(shè)論團(tuán)seo網(wǎng)站推廣報(bào)價(jià)