C語言實現(xiàn)內(nèi)存函數(shù)的示例代碼
一、前言
在C語言中有著常見的內(nèi)存函數(shù),他們可以對內(nèi)存進行操作,即可以修改內(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 );
下面我們可以舉一個簡單的使用案例
#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使用細節(jié):
- 目標空間大小不能小于要拷貝的內(nèi)存的大小
- memcpy不會因為遇到’\0’而停止
- memcpy目標內(nèi)存不能是拷貝的內(nèi)存,不然復(fù)制的結(jié)果是不可預(yù)知的,也就是說內(nèi)存不能重疊,如:memcpy(arr, arr, …)
三、 memmove(內(nèi)存移動)
memmove的功能與memcpy的功能可以說是一樣的,但是memmove有一個與memcpy不同的點,就是memmove可以操作重疊的內(nèi)存,因為memmove會將要復(fù)制的內(nèi)存的內(nèi)容復(fù)制到臨時緩沖區(qū),然后再復(fù)制帶目標內(nèi)存中
void * memmove ( void * destination, const void * source,size_t num );
下面我們進行演示
#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ù)進行了后移
四、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é)比較兩個內(nèi)存區(qū)域的內(nèi)容,比較的字節(jié)數(shù)由參數(shù) n 指定。比較從兩個內(nèi)存區(qū)域的起始位置開始,依次比較每個字節(jié)的值
返回值
- 如果兩個內(nèi)存區(qū)域在前 n 字節(jié)內(nèi)完全相同,返回 0。
- 如果第一個不同的字節(jié)在 s1 中的值小于 s2 中的值,返回 負整數(shù)。
- 如果第一個不同的字節(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ù)組
使用細節(jié)
- 比較的字節(jié)數(shù): memcmp 只比較指定的 n 字節(jié)。如果兩個內(nèi)存區(qū)域在前 n 字節(jié)內(nèi)相同,即使后面的字節(jié)不同,memcmp 也會返回 0
- 內(nèi)存區(qū)域的大?。?/strong> 確保兩個內(nèi)存區(qū)域的大小至少為 n 字節(jié),否則可能會導(dǎo)致未定義行為(如訪問越界)
- 返回值的含義: memcmp 的返回值是一個整數(shù),表示兩個內(nèi)存區(qū)域的比較結(jié)果。返回值的具體值(正數(shù)或負數(shù))取決于第一個不同的字節(jié)的值
六、End
到此這篇關(guān)于C語言實現(xiàn)內(nèi)存函數(shù)的示例代碼的文章就介紹到這了,更多相關(guān)C語言 內(nèi)存函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解
- c語言重要的字符串與內(nèi)存函數(shù)
- C語言內(nèi)存函數(shù)的使用及其模擬實現(xiàn)
- C語言詳解如何應(yīng)用模擬字符串和內(nèi)存函數(shù)
- C語言超詳細講解字符串函數(shù)和內(nèi)存函數(shù)
- C語言深入詳解四大內(nèi)存函數(shù)的使用
- C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實現(xiàn)
- 深入了解C語言中的字符串和內(nèi)存函數(shù)
- 深度解析三個常見的C語言內(nèi)存函數(shù)
- C語言內(nèi)存函數(shù)的實現(xiàn)示例
- C語言內(nèi)存函數(shù)的具體使用
相關(guān)文章
C語言數(shù)組實現(xiàn)三子棋應(yīng)用實例
這篇文章主要為大家詳細介紹了C語言數(shù)組實現(xiàn)三子棋應(yīng)用實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01在動態(tài)庫和靜態(tài)庫中使用模板(dynamic libraries ,static libraries)
給大家介紹一下在動態(tài)庫(dynamic libraries)和靜態(tài)庫(static libraries)使用模板(template)的用法和解決方案。2017-11-11深入探討:宏、內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別
本篇文章是對宏、內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別進行了詳細的分析介紹,需要的朋友參考下2013-05-05