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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C/C++与内存相关的函数

發(fā)布時(shí)間:2023/11/29 c/c++ 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++与内存相关的函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語(yǔ)言的標(biāo)準(zhǔn)函數(shù)庫(kù)與內(nèi)存管理有關(guān)的函數(shù)從功能上分為兩類:一類是系統(tǒng)對(duì)內(nèi)存操作的函數(shù),例如,讀內(nèi)存的函數(shù)、寫內(nèi)存函數(shù),如從指定地址向內(nèi)存寫一個(gè)字節(jié),一個(gè)字或向內(nèi)存讀一個(gè)字節(jié)或一個(gè)字操作;另一類是供用戶動(dòng)態(tài)使用內(nèi)存的函數(shù),例如,分配C程序一塊存儲(chǔ)區(qū),并將該區(qū)清零函數(shù);

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

假如欲設(shè)計(jì)一個(gè)C程序,要求從一個(gè)文件讀取一組數(shù)據(jù)并存放在數(shù)組中。如果無(wú)法預(yù)先知道文件中數(shù)據(jù)的確切數(shù)量,或者在再次運(yùn)行時(shí)文件的數(shù)量發(fā)生變化,那么就需要在程序中把數(shù)組定義得足夠大,才能適應(yīng)上述情況。但這樣做往往導(dǎo)致內(nèi)存空間的浪費(fèi)。動(dòng)態(tài)分配內(nèi)存可使程序在執(zhí)行過(guò)程中獲得需要的內(nèi)存空間,以便更有效地利用內(nèi)存空間。現(xiàn)將常用內(nèi)存管理函數(shù)及其使用分別介紹于下:

(1)calloc()函數(shù)

功能
該函數(shù)是分配給C程序一塊存儲(chǔ)區(qū),并將該存儲(chǔ)區(qū)消零。程序在調(diào)用該函數(shù)時(shí)需要引用兩個(gè)參數(shù),分別指出程序分配對(duì)象個(gè)數(shù)和每個(gè)對(duì)象所需內(nèi)存空間的字節(jié)數(shù)。calloc函數(shù)返回一個(gè)內(nèi)存儲(chǔ)區(qū)的字符指針,指向所分配內(nèi)存區(qū)域的起始位置。若函數(shù)調(diào)用失敗,返回NULL。調(diào)用格式calloc(number,size);
說(shuō)明
調(diào)用此函數(shù)后,可占用從內(nèi)存地址number開(kāi)始的size個(gè)字符長(zhǎng)度的連續(xù)內(nèi)存空間,函數(shù)返回指向該空間起始位置的指針。
當(dāng)內(nèi)存空間不夠分配時(shí),calloc()返回空指針。因此,calloc()是一個(gè)返回值為指向字符的指針的函數(shù)。即
char *calloc();
其中number、size為無(wú)符號(hào)整數(shù),即
unsigned int number size;
應(yīng)用舉例
應(yīng)用calloc()函數(shù)從堆中申請(qǐng)255個(gè)字節(jié)的存儲(chǔ)區(qū),并向該區(qū)輸入輸出字符串,可編寫如
下程序?qū)崿F(xiàn):

#include #defint N 255 #define S 1 main() extern char *calloc()extern char *fgets(); extern int fputs(),free(); char *buffer; buffer=calloc(N,S);if (!buffer) abort("Ug,too big \n"); fputs ("Enter data follwed by Ctrl-Z\n),stdout);while (fgets(buffer,N,sldin)) fputs (buffer,stdout); free(buffer); }

(2)malloc()函數(shù)

調(diào)用格式
malloc(Size);
功能
該函數(shù)被調(diào)用后,可占用預(yù)先指定了的內(nèi)存區(qū)中的size個(gè)字符長(zhǎng)度的連續(xù)內(nèi)存空間,它允許程序按需要分配內(nèi)存,而且恰好分配所需的大小。
說(shuō)明
如果該函數(shù)調(diào)用成功,返回size空間的第一個(gè)字節(jié)的地址,當(dāng)內(nèi)存空間不夠分配時(shí),返回
NULL。它也是一個(gè)返回值為指向字符的指針函數(shù),即:
char *malloc();
size也是無(wú)符號(hào)數(shù),即;
unsigned int size;
malloc()與calloc()的區(qū)別是,malloc()只能在指定的內(nèi)存空間中占用size個(gè)字符長(zhǎng)度的連續(xù)空間,而calloc()可在任意的內(nèi)存空間占用size個(gè)字符長(zhǎng)度連續(xù)空間,這個(gè)內(nèi)存空間的起始位置在調(diào)用函數(shù)calloc()時(shí),臨時(shí)指定。
應(yīng)用舉例
使用malloc()函數(shù)從堆中分配255個(gè)字節(jié)存儲(chǔ)區(qū),并對(duì)該區(qū)清零。
可編寫如下程序?qū)崿F(xiàn):

#include main() { extern char *malloc(); extern int free(); char *buf ; unsigned number-bytes; int i; number-bytes=255; buf=malloc(number-bytes); printf("%s\n",buf); for(i=0;j *(buf+j)=EOS; printf("%s\n",buf); free(buf); } }

(3)free()函數(shù)

調(diào)用格式
free(pointer);
功能
該函數(shù)釋放由calloc()或malloc()函數(shù)分配的存儲(chǔ)空間,以便下次重新分配,以提高內(nèi)存資源的使用效率。
說(shuō)明
函數(shù)free()的調(diào)用需要一個(gè)指定釋放內(nèi)存空間的指針參數(shù),在程序中應(yīng)為字符型指針,
即:
char *pointer;
如果釋放成功,函數(shù)free(pointer)返回值為零:當(dāng)pointer參數(shù)為無(wú)效指針,返回值為-
1。

(4)rcalloc()函數(shù)

調(diào)用格式
rcalloc(pointersize);
功能
該函數(shù)用于改變callc()或malloc()所占用的內(nèi)存區(qū)的大小,即將calloc()或malloc()
指定的size數(shù)改為rcalloc()指定的size指定的size數(shù)。
說(shuō)明
該函數(shù)調(diào)用成功返回由pointer指針變量所指向的地址;當(dāng)內(nèi)存空間不夠分配時(shí),返回值為0。當(dāng)不需要占用的內(nèi)存空間時(shí),用free()或cfree()釋放。

2.內(nèi)存讀寫函數(shù)

(1)peek()函數(shù)

功能
從內(nèi)存指定的段偏移地址單元中讀一個(gè)字。
格式
int peek ( unsigned segment,unsigned offset);
說(shuō)明
peek()函數(shù)返回相應(yīng)地址上的一個(gè)字的內(nèi)容。
內(nèi)存各地址是以段地址:偏移地址的格式。例如,0070:0000是絕對(duì)地址×’0700’。
應(yīng)用實(shí)例
利用peek()函數(shù),讀取40:13單元的內(nèi)容(此單元的一個(gè)字記錄著系統(tǒng)存儲(chǔ)器總?cè)萘?以KB為單位)并顯示到屏幕上。可編寫如下的程序?qū)崿F(xiàn):

#include #include #define SEGMENT 0X0040 #define OFFSET 0X0013 main() { int value=0; value=peek(SEGMENT,OFFSET); printf("\n The RAM is %d K.",value); getchar(); exit(0); }

(2)peekb()函數(shù)

功能 從內(nèi)存指定的段:偏移中讀取一個(gè)字節(jié)。
格式 char peekb(unsigned segment,unsigned offset);
說(shuō)明 peekb()函數(shù)返回相應(yīng)地址上的一個(gè)字節(jié)的內(nèi)容。
應(yīng)用實(shí)例 讀取0X40:0X11處的一個(gè)字節(jié),并分析其硬件設(shè)備的配置情況。可編寫如下程序?qū)崿F(xiàn):

#include #include #iclude main() { char value=0; char va; printf("\n 當(dāng)前機(jī)器的硬件配置"); value=peekb(0X40,0X11); if (Value & 1); printf ("\n DMA芯片已被安裝"); else printf("\n DMA芯片沒(méi)有安裝"); if (value & 16); printf("\n 游戲卡已經(jīng)安裝"); if (value & 32); printf("\n 串行打印機(jī)已經(jīng)安裝"); va=value>>6; printf("\n 打印機(jī)安裝的數(shù)目為%d,va); }

(3)poke()涵數(shù)

功能 向內(nèi)存中寫一個(gè)字。
格式 void poke ( unsigned segment,unsigned offset,int value);
說(shuō)明 其中segment為要寫入內(nèi)存的段地址。offset為要寫入內(nèi)存的偏移量。value為要寫入內(nèi)存的值。
由于poke()函數(shù)有修改內(nèi)存數(shù)據(jù)的能力,所以使用此函數(shù)時(shí)一定要注意,如果操作錯(cuò)誤,其結(jié)果常常是死機(jī)。出現(xiàn)此類錯(cuò)誤的原因多是由于指定的段地址、偏移地址的數(shù)值不正確或沒(méi)有賦予初值,再有就是所寫的數(shù)值不被系統(tǒng)所承認(rèn)。

(4)poded()函數(shù)

功能 向內(nèi)存中寫一個(gè)字節(jié)。
格式 void poke (unsigned segment,unsigned offset,char value);
說(shuō)明 其中segment為要寫入內(nèi)存的段地址,offset為要寫入內(nèi)存的偏移量。value為要寫入內(nèi)
存的值。
應(yīng)用實(shí)例
從段地址100H處開(kāi)始寫內(nèi)存5個(gè)字的數(shù)據(jù),然后逐個(gè)字讀取。可編寫如下的程序?qū)崿F(xiàn):

#include main() { extern int peek(); extern int poke(); unsigned offset,segment; int word=0x0000; int i; segment=0x100; putchar("/n"); for(offset=0;offset<10;offset++) poked(offset,segment word++); for(offset=0;offset<10;offset) { word=peek(offset,segment); printf("peek(%xh,%xh)=%xh\n",offset segment,word); offset++=2 } }綜合地使用poke(),pokeb(),peek(),peekb()這四個(gè)函數(shù),可以達(dá)到控制操作系統(tǒng)的軟件資源的目的。

總結(jié)

以上是生活随笔為你收集整理的C/C++与内存相关的函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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