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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

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

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

1.動態(tài)內存分配函數(shù)

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

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

功能
該函數(shù)是分配給C程序一塊存儲區(qū),并將該存儲區(qū)消零。程序在調用該函數(shù)時需要引用兩個參數(shù),分別指出程序分配對象個數(shù)和每個對象所需內存空間的字節(jié)數(shù)。calloc函數(shù)返回一個內存儲區(qū)的字符指針,指向所分配內存區(qū)域的起始位置。若函數(shù)調用失敗,返回NULL。調用格式calloc(number,size);
說明
調用此函數(shù)后,可占用從內存地址number開始的size個字符長度的連續(xù)內存空間,函數(shù)返回指向該空間起始位置的指針。
當內存空間不夠分配時,calloc()返回空指針。因此,calloc()是一個返回值為指向字符的指針的函數(shù)。即
char *calloc();
其中number、size為無符號整數(shù),即
unsigned int number size;
應用舉例
應用calloc()函數(shù)從堆中申請255個字節(jié)的存儲區(qū),并向該區(qū)輸入輸出字符串,可編寫如
下程序實現(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ù)

調用格式
malloc(Size);
功能
該函數(shù)被調用后,可占用預先指定了的內存區(qū)中的size個字符長度的連續(xù)內存空間,它允許程序按需要分配內存,而且恰好分配所需的大小。
說明
如果該函數(shù)調用成功,返回size空間的第一個字節(jié)的地址,當內存空間不夠分配時,返回
NULL。它也是一個返回值為指向字符的指針函數(shù),即:
char *malloc();
size也是無符號數(shù),即;
unsigned int size;
malloc()與calloc()的區(qū)別是,malloc()只能在指定的內存空間中占用size個字符長度的連續(xù)空間,而calloc()可在任意的內存空間占用size個字符長度連續(xù)空間,這個內存空間的起始位置在調用函數(shù)calloc()時,臨時指定。
應用舉例
使用malloc()函數(shù)從堆中分配255個字節(jié)存儲區(qū),并對該區(qū)清零。
可編寫如下程序實現(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ù)

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

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

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

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

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

功能
從內存指定的段偏移地址單元中讀一個字。
格式
int peek ( unsigned segment,unsigned offset);
說明
peek()函數(shù)返回相應地址上的一個字的內容。
內存各地址是以段地址:偏移地址的格式。例如,0070:0000是絕對地址×’0700’。
應用實例
利用peek()函數(shù),讀取40:13單元的內容(此單元的一個字記錄著系統(tǒng)存儲器總容量,以KB為單位)并顯示到屏幕上。可編寫如下的程序實現(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ù)

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

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

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

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

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

功能 向內存中寫一個字節(jié)。
格式 void poke (unsigned segment,unsigned offset,char value);
說明 其中segment為要寫入內存的段地址,offset為要寫入內存的偏移量。value為要寫入內
存的值。
應用實例
從段地址100H處開始寫內存5個字的數(shù)據(jù),然后逐個字讀取??删帉懭缦碌某绦驅崿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()這四個函數(shù),可以達到控制操作系統(tǒng)的軟件資源的目的。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。