close

memset ,memcpy 和strcpy 的根本區別


#include "memory.h"

memset用來對一段內存空間全部設置為某個字符,一般用在對定義的字符串進行初始化為『 '或『\0';例:char a[100];memset(a, '\0', sizeof(a));

memcpy用來做內存拷貝,你可以拿它拷貝任何數據類型的對象,可以指定拷貝的數據長度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),會造成b的內存地址溢出。

strcpy就只能拷貝字符串了,它遇到'\0'就結束拷貝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串長度(第一個『\0'之前)是否超過50位,如超過,則會造成b的內存地址溢出。

strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#i nclude
功能:把src所指由NULL結束的字符串複製到dest所指的數組中。
說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回指向dest的指針。
memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#i nclude
功能:由src所指內存區域複製count個字節到dest所指內存區域。
說明:src和dest所指內存區域不能重疊,函數返回指向dest的指針。

example
/* memcpy example */
#include
#include

int main ()
{
char str1[]="Sample string";
char str2[40];
char str3[40];
memcpy (str2,str1,strlen(str1)+1);
memcpy (str3,"copy successful",16);
printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
return 0;
}

memset
原型:extern void *memset(void *buffer, int c, int count);
用法:#i nclude
功能:把buffer所指內存區域的前count個字節設置成字符c。
說明:返回指向buffer的指針




strcpy

原型:extern char *strcpy(char *dest,char *src);
用法:#include <string.h>
功能:把src所指由NULL結束的字符串複製到dest所指的數組中。
說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字符串。
    返回指向dest的指針。

例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串長度(第一個『\0』之前)是否超過50位,如超過,則會造成b的記憶體地址溢出。

memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>
功能:由src所指記憶體區域複製count個字節到dest所指記憶體區域。
說明:src和dest所指記憶體區域不能重疊,函數返回指向dest的指針。可以拿它拷貝任何數據類型的對象。

舉例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),會造成b的記憶體地址溢出。

memset
原型:extern void *memset(void *buffer, int c, int count);
用法:#include <string.h>
功能:把buffer所指記憶體區域的前count個字節設置成字符c。
說明:返回指向buffer的指針。用來對一段記憶體空間全部設置為某個字符。

舉例:char a[100];memset(a, '\0', sizeof(a));

memset可以方便的清空一個結構類型的變數或數組。

如:
struct sample_struct
{
char   csName[16];
int   iSeq;
int   iType;
};

對於變數
struct sample_strcut stTest;

一般情況下,清空stTest的方法:
stTest.csName[0]='\0';
stTest.iSeq=0;
stTest.iType=0;

用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));

如果是數組:
struct sample_struct   TEST[10];

memset(TEST,0,sizeof(struct sample_struct)*10);

對這個問題有疑問,不是對函數的疑問,而是因為沒有弄懂mem和str的區別。
mem是一段記憶體,他的長度,必須你自己記住
str也是一段記憶體,不過它的長度,你不用記,隨時都可以計算出來
所以memcpy需要第三個參數,而strcpy不需要


引用 http://tw.myblog.yahoo.com/jw!C8o78amGHxpmt7niVSLKqfN4pg--/article?mid=46&prev=47&next=45

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Chris701203 的頭像
    Chris701203

    Chris701203

    Chris701203 發表在 痞客邦 留言(0) 人氣()