1. 程式人生 > >linux中strcpy、memcpy的用法與區別

linux中strcpy、memcpy的用法與區別

strcpy提供了字串的複製,以 \0 為結束標誌(即一旦遇到資料值為0的記憶體地址,拷貝過程即結束)。

函式原型如下:

char *strcpy(char *dest, const char *src);

其在核心(lib\string.h)原始碼的實現如下:

char *strcpy(char *dest, const char *src)

{

char *tmp = dest;

while( (*dest++ = *src++) != '\0' );

return tmp;

}

即最關鍵的一點是用到了如下的迴圈
 while ((*dest++ = *src++) != '\0');

這就是為什麼用此複製字串是會出現異常終止的現象。也可以看出strcpy最終是給目的串的末尾賦了結束符'\0'的。

而memcpy是給定來源和目標後,拷貝指定大小n的記憶體資料,而不管拷貝的內容是什麼,根據定義可知不僅限於字元之間的操作。
memcpy的原型為:
void *memcpy(void *dest, const void *src, size_t n);
其在核心原始碼中(lib/string.h)的實現如下:

void *memcpy(void *dest, const void *src, size_t count)
 {
         char *tmp = dest;
         const char *s = src;
         while (count--)
                 *tmp++ = *s++;
         return dest;
 }


strcpy和memcpy主要有以下3個方面的區別。
1、複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。
3、用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy
不難看出,如果你用來複制字串,memcpy複製的最後並沒有給目的字串dset賦結束符'\0'(由使用者的源字串長度和內容決定)。假如使用者源字串很長,而只需複製一段給目標dest串,因此如果使用者要列印複製的結果,那麼最後的一步操作就是給dest[count]='\0'。然而這時使用者的設定的目的串要足夠大,至少比count大1個字元用來存放結束符。
如果不曉得這點的話,使用者編寫的程式也可能打印出來的是很長的字串或是末尾攜帶一些亂碼了。


相關推薦

linuxstrcpymemcpy用法區別

strcpy提供了字串的複製,以 \0 為結束標誌(即一旦遇到資料值為0的記憶體地址,拷貝過程即結束)。 函式原型如下: char *strcpy(char *dest, const char *src); 其在核心(lib\string.h)原始碼的實現如下: char

jsslicesplice用法區別

delet 內容 title pan ont 指定 至少 一個 拷貝 1.slice(start,end)(參數可選) slice() 方法返回一個從開始到結束(不包括結束)選擇的數組的一部分淺拷貝到一個新數組對象。原始數組不會被修改。 var a = [‘a‘, ‘b‘

pxemremrpx 用法 區別

這篇文章記錄前端(包含小程式)開發中常用到的幾個單位 px、em、rem、rpx 的區別和用法。 px px畫素(Pixel)。相對長度單位。畫素px是相對於顯示器螢幕解析度而言的。 PX特點 1. IE無法調整那些使用px作為單位的字型大小; 2.

Linuxwgetyumapt-get用法區別

一般來說著名的linux系統基本上分兩大類: RedHat系列:Redhat、Centos、Fedora等 Debian系列:Debian、Ubuntu等 RedHat 系列  常見的安裝包格式 rpm包,安裝rpm包的命令是“rpm -引數” 包管理工具 yum 支援tar包 Deb

淺談JS的!=== !=====的用法區別 JSNullUndefined的區別 讀取XML文件 獲取路徑的方式 C#Cookie,Session,Application的用法區別? c#反射 抽象工廠

main 收集 data- 時間設置 oba ase pdo 簡單工廠模式 1.0 var num = 1; var str = ‘1‘; var test = 1; test == num //true 相同類型 相同值 te

Spring@Resource@Autowired@Qualifier的用法區別

-h 進行 如果 註解 tool j2e vat 裝配 light 1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上。 2、@Autowired默認按類型裝配(這個註解是屬業spring的),默認情況下必須要求

SQL查詢inexistsnot innot exists的用法區別

1、in和exists in是把外表和內表作hash(字典集合)連線,而exists是對外表作迴圈,每次迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的,如果查詢的兩個表大小相當,那麼用in和exists差別不大;如果兩個表中一個較小一

Linuxprofilebashrcbash_profile之間的區別和聯系(轉)

用戶登錄 upd rtu 文件輸入 當前 設定 log set less /etc/profile:此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行.並從/etc/profile.d目錄的配置文件中搜集shell的設置. 英文描述為: # /etc/pr

linuxcatmoreless命令區別詳解

more|less本文轉自:http://blog.csdn.net/xyw_blog/article/details/16861681在《Python絕技》這本書的第一個小程序首先展示了針對與unix系統中shadow文件密碼的暴力破解的能力,因為之前只是對shadow文件停留在保存了用戶密碼的階段,但並沒

linuxwget apt-getyum rpm區別

關系 軟件包管理器 HA nbsp ubunt eba AC nag 直接 linux中wget 、apt-get、yum rpm區別 wget 類似於迅雷,是一種下載工具, 通過HTTP、HTTPS、FTP三個最常見的TCP/IP協議下載,並可以使用H

c++類public,private,protected的用法區別

1、public修飾的成員變數 在程式的任何地方都可以被訪問,就是公共變數的意思,不需要通過成員函式就可以由類的例項直接訪問 2、private修飾的成員變數 只有類內可直接訪問,私有的,類的例項要通過成員函式才可以訪問,這個可以起到資訊隱藏 3、protected是受保護變數 類內

ARM指令集--ldrmovstr的用法區別

ARM指令集–ldr、mov與str的用法與區別 ARM 是 RISC 結構,因此只能使用精簡指令。 1. mov的用法 在ARM體系中,mov只能用於資料在暫存器之間的移動或者往暫存器中寫入立即數。格式如下:mov{條件}{s} 目的暫存器,源運算元

linuxsleepusleppdelay命令的使用

有時候寫Shell的指令碼,用於順序執行一系列的程式。 有些程式在停止之後並沒能立即退出,就例如有一個 tomcat 掛了,就算是用 kill -9 命令也還沒瞬間就結束掉。 這麼如果 shell 還沒等其退出就接著執行下一行,這麼就出亂子了。 剛知道了原來 shell 也能有 slee

JS的!=== !===== 的用法區別

<script type="text/javascript" src="jquery-3.2.1.js"></script> <script type="text/javascript"> $(function () { var v=1; var v1='

jquery easyui tab頁新增其他頁面,hrefcontent的用法區別

//tab頁增加 function addPanel(name,url){ var dd = $('#tt').tabs('exists',name); if(dd){ $('#tt').tabs('select',name); }else{ var content

Linux學習筆記RHEL 7(十三)--Linuxsusu -和sudo的區別

su 切換到root使用者,但是並沒有轉到root使用者家目錄下,即沒有改變使用者的環境。 su - 切換到root使用者,並轉到root使用者的家目錄下,即改變到了root使用者的環境。 這個涉及到不同使用者下的環境變數的配置。 sudo 通過sudo,我們能把

OracleROWNUM偽列和ROWID偽列的用法區別

做過Oracle分頁的人都知道由於Oracle中沒有像MySql中limit函式以及SQLServer中的top關鍵字等,所以只能通過偽列的方式去滿足分頁功能,在此,不談分頁方法,只從根本上去介紹這兩個偽列的用法與原理,同樣還是以scott使用者的emp表為例;一、ROWNUM偽列ROWNUM 是Oracle

linuxbgfgctrl+zctrl+d和ctrl+c的區別

fg、bg、jobs、&、ctrl + z都是跟系統任務有關的,雖然現在基本上不怎麼需要用到這些命令,但學會了也是很實用的 一。& 最經常被用到    這個用在一個命令的最後,可以把這個命令放到後臺執行 $ pct & 二。ctrl +

多執行緒sleep() wait() yield() join(), interrupt(),stop(),suspend()用法區別

網上卻是有很多的關於這個的答案,但是都長得一樣,為了寫這篇部落格,自己找了幾個例子。 JoinThread: package com.com.aaa.threadJoinDemo; public c

多執行緒sleep() wait() yield() join(), interrupt(),stop(),suspend(),setPriority()用法區別

網上卻是有很多的關於這個的答案,但是都長得一樣,為了寫這篇部落格,自己找了幾個例子。 JoinThread: package com.com.aaa.threadJoinDemo; public class JoinThread extends Thread{ publ