C語言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼
一、前言
在C語言中有著常見的內(nèi)存函數(shù),他們可以對(duì)內(nèi)存進(jìn)行操作,即可以修改內(nèi)存的內(nèi)容等,下面我們來簡略地學(xué)習(xí)一下
二、memcpy(內(nèi)存復(fù)制)
cpy是復(fù)制的意思,顧名思義,就是將一塊指定大小的內(nèi)存的字節(jié)逐一賦值到新的內(nèi)存塊上,下面是memcpy的定義
void * memcpy ( void * destination, const void * source, 1 size_t num );
下面我們可以舉一個(gè)簡單的使用案例
#include <stdio.h> #include <string.h> int main() { int arr1[10] = { 0,1,2,3,4,5,6,7,8,9 }; int arr2[10]; memcpy(arr2, arr1, sizeof(arr1)); for (int i = 0; i < 10; i++) { printf("%d ", arr2[i]); } printf("\n"); return 0; }
可以看到,這里我將arr1數(shù)組的內(nèi)存數(shù)據(jù)復(fù)制到了arr2數(shù)組中
memcpy使用細(xì)節(jié):
- 目標(biāo)空間大小不能小于要拷貝的內(nèi)存的大小
- memcpy不會(huì)因?yàn)橛龅?rsquo;\0’而停止
- memcpy目標(biāo)內(nèi)存不能是拷貝的內(nèi)存,不然復(fù)制的結(jié)果是不可預(yù)知的,也就是說內(nèi)存不能重疊,如:memcpy(arr, arr, …)
三、 memmove(內(nèi)存移動(dòng))
memmove的功能與memcpy的功能可以說是一樣的,但是memmove有一個(gè)與memcpy不同的點(diǎn),就是memmove可以操作重疊的內(nèi)存,因?yàn)閙emmove會(huì)將要復(fù)制的內(nèi)存的內(nèi)容復(fù)制到臨時(shí)緩沖區(qū),然后再復(fù)制帶目標(biāo)內(nèi)存中
void * memmove ( void * destination, const void * source,size_t num );
下面我們進(jìn)行演示
#include <stdio.h> #include <string.h> int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10]; memmove(arr2, arr1, sizeof(arr1)); memmove(arr1 + 1, arr1, sizeof(int) * 9); for (int i = 0; i < 10; i++) { printf("%d ", arr1[i]); } printf("\n"); for (int i = 0; i < 10; i++) { printf("%d ", arr2[i]); } return 0; }
這里我將arr1中的數(shù)據(jù)復(fù)制到了arr2中,然后將arr1的數(shù)據(jù)進(jìn)行了后移
四、memset(內(nèi)存設(shè)置)
memset的函數(shù)的作用是將指定內(nèi)存大小的內(nèi)存塊中的值設(shè)置為想要的值
void * memset ( void * ptr, int value, size_t num );
下面我們來舉例一些例子
#include <stdio.h> #include <string.h> int main() { char arr1[] = "HelloWorld!"; printf("%s\n", arr1); memset(arr1, 'X', 5); printf("%s\n", arr1); return 0; }
這里我使用了memset函數(shù)將Hello替換成了X
五、memcmp(比較指定字節(jié))
memcmp 逐字節(jié)比較兩個(gè)內(nèi)存區(qū)域的內(nèi)容,比較的字節(jié)數(shù)由參數(shù) n 指定。比較從兩個(gè)內(nèi)存區(qū)域的起始位置開始,依次比較每個(gè)字節(jié)的值
返回值
- 如果兩個(gè)內(nèi)存區(qū)域在前 n 字節(jié)內(nèi)完全相同,返回 0。
- 如果第一個(gè)不同的字節(jié)在 s1 中的值小于 s2 中的值,返回 負(fù)整數(shù)。
- 如果第一個(gè)不同的字節(jié)在 s1 中的值大于 s2 中的值,返回 正整數(shù)。
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
同樣我們舉例一下案例
#include <stdio.h> #include <string.h> int main() { char arr1[] = "HelloWorld!"; char arr2[] = "AelloWorld!"; if (memcmp(arr1, arr2, sizeof(arr1)) > 0) { printf("arr1字符串大!\n"); } return 0; }
這里我使用了字符串比較,但并不代表著只能比較字符串,memcmp也可以比較其他類型的數(shù)組
使用細(xì)節(jié)
- 比較的字節(jié)數(shù): memcmp 只比較指定的 n 字節(jié)。如果兩個(gè)內(nèi)存區(qū)域在前 n 字節(jié)內(nèi)相同,即使后面的字節(jié)不同,memcmp 也會(huì)返回 0
- 內(nèi)存區(qū)域的大?。?/strong> 確保兩個(gè)內(nèi)存區(qū)域的大小至少為 n 字節(jié),否則可能會(huì)導(dǎo)致未定義行為(如訪問越界)
- 返回值的含義: memcmp 的返回值是一個(gè)整數(shù),表示兩個(gè)內(nèi)存區(qū)域的比較結(jié)果。返回值的具體值(正數(shù)或負(fù)數(shù))取決于第一個(gè)不同的字節(jié)的值
六、End
到此這篇關(guān)于C語言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼的文章就介紹到這了,更多相關(guān)C語言 內(nèi)存函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解
- c語言重要的字符串與內(nèi)存函數(shù)
- C語言內(nèi)存函數(shù)的使用及其模擬實(shí)現(xiàn)
- C語言詳解如何應(yīng)用模擬字符串和內(nèi)存函數(shù)
- C語言超詳細(xì)講解字符串函數(shù)和內(nèi)存函數(shù)
- C語言深入詳解四大內(nèi)存函數(shù)的使用
- C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)
- 深入了解C語言中的字符串和內(nèi)存函數(shù)
- 深度解析三個(gè)常見的C語言內(nèi)存函數(shù)
- C語言內(nèi)存函數(shù)的實(shí)現(xiàn)示例
- C語言內(nèi)存函數(shù)的具體使用
相關(guān)文章
C++求所有頂點(diǎn)之間的最短路徑(用Dijkstra算法)
這篇文章主要為大家詳細(xì)介紹了C++用Dijkstra算法求所有頂點(diǎn)之間的最短路徑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04詳解Dijkstra算法原理及其C++實(shí)現(xiàn)
Dijkstra算法用于計(jì)算一個(gè)節(jié)點(diǎn)到其他節(jié)點(diǎn)的最短路徑。Dijkstra是一種按路徑長度遞增的順序逐步產(chǎn)生最短路徑的方法,是一種貪婪算法。本文將詳解Dijkstra算法原理及其C++實(shí)現(xiàn),感興趣的可以了解一下2022-07-07C++實(shí)現(xiàn)String類實(shí)例代碼
這篇文章主要介紹了C++實(shí)現(xiàn)String類實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04C語言數(shù)組實(shí)現(xiàn)三子棋應(yīng)用實(shí)例
這篇文章主要為大家詳細(xì)介紹了C語言數(shù)組實(shí)現(xiàn)三子棋應(yīng)用實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01VC實(shí)現(xiàn)獲取本機(jī)MAC地址的方法
這篇文章主要介紹了VC實(shí)現(xiàn)獲取本機(jī)MAC地址的方法,需要的朋友可以參考下2014-07-07在動(dòng)態(tài)庫和靜態(tài)庫中使用模板(dynamic libraries ,static libraries)
給大家介紹一下在動(dòng)態(tài)庫(dynamic libraries)和靜態(tài)庫(static libraries)使用模板(template)的用法和解決方案。2017-11-11深入探討:宏、內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別
本篇文章是對(duì)宏、內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05