隨筆-144  評論-80  文章-1  trackbacks-0

           

          memset請教

           
          作者:tianzhushan     發(fā)表時間:2002/09/03 09:08am
           
          版主:
             請問:
             memset ,memcpy 和strcpy 的根本區(qū)別?
             我總覺得memset,memcpy 可以用strcpy等代替 
           

          --------------------------------------------------------------------------------
          此文章相關(guān)評論:
           
          該文章有15個相關(guān)評論如下:(點這兒可以發(fā)表評論)
           
          zhuhuix 發(fā)表于: 2002/09/03 09:14am
           
          char str[100];
          memset(str,0,100);
          memcpy(str,"This is a",9);
          strcpy(&str[9],"example!");
           
          yuejw 發(fā)表于: 2002/09/03 09:14am
           
          它們用處不同,但大部分情況下可以完成相同的要求。
          memset用來對一段內(nèi)存空間全部設(shè)置為某個字符。

          memcpy用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對象。

          strcpy就只能拷貝字符串了,它遇到'\0'就結(jié)束拷貝。
           
           
          HopeCao 發(fā)表于: 2002/09/03 10:02am
           
          很詳細(xì)!
           
          tianzhushan 發(fā)表于: 2002/09/03 05:37pm
           
          各位: 
             能否就這三者的最典型的應(yīng)用各舉一個例子。
             結(jié)合例子,說說他們的區(qū)別和聯(lián)系,以及為什么用這個而不用另外一個。
             越詳細(xì)越好。
             謝謝!
           
          betydu 發(fā)表于: 2002/09/04 09:21am
           
          對版主yuejw的補充
          memset用來對一段內(nèi)存空間全部設(shè)置為某個字符,一般用在對定義的字符串進行初始化為‘ ’或‘\0’;例:char a[100];memset(a, '\0', sizeof(a));
          memcpy用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對象,可以指定拷貝的數(shù)據(jù)長度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),會造成b的內(nèi)存地址溢出。

          strcpy就只能拷貝字符串了,它遇到'\0'就結(jié)束拷貝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串長度(第一個‘\0’之前)是否超過50位,如超過,則會造成b的內(nèi)存地址溢出。
           
           
          iloveunix 發(fā)表于: 2002/09/04 04:56pm
           
          補充:我的一點心得
          memset可以方便的清空一個結(jié)構(gòu)類型的變量或數(shù)組。
          如:
          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));

          如果是數(shù)組:
          struct sample_struct   TEST[10];

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

           
           
          zhtrue 發(fā)表于: 2002/09/04 05:06pm
           
          對這個問題有疑問,不是對函數(shù)的疑問,而是因為沒有弄懂mem和str的區(qū)別。
          mem是一段內(nèi)存,他的長度,必須你自己記住
          str也是一段內(nèi)存,不過它的長度,你不用記,隨時都可以計算出來
          所以memcpy需要第三個參數(shù),而strcpy不需要
           
           
          tianzhushan 發(fā)表于: 2002/09/05 06:19pm
           
          謝謝各位的高見!小弟受益匪淺
           
          凌曦 發(fā)表于: 2002/09/05 09:47pm
           
          str也可以用用個參數(shù)的strncpy(a,b,n)
           
          arbol 發(fā)表于: 2002/09/06 03:02pm
           
          還有,記住memcpy是不拷貝最后的終止符的
           
          編程浪子 發(fā)表于: 2002/09/12 00:58am
           
          樓上的郵政老兄好像說錯了吧?應(yīng)該是strcpy不拷貝'\0'的,而memcpy應(yīng)該是通吃,見著什么拷貝什么。
           
          chrmhf 發(fā)表于: 2002/09/13 08:29am
           
          memset主要應(yīng)用是初始化某個內(nèi)存空間。
          memcpy是用于COPY源空間的數(shù)據(jù)到目的空間中。
          strcpy用于字符串COPY,遇到‘\0’,將結(jié)束。
          ----------------------
          如果你理解了這些,你應(yīng)該知道他們的區(qū)別:例如你初始化某塊空間的時候,用到memcpy
          那么應(yīng)該怎么寫,是不是顯得很笨。
          int  m[100]
          ->memset((void*)m,0x00,sizeof(int)*100);//GOOD
          ..memcpy((void*)m,"\0\0\0\0....",sizeof(int)*100);//foolish
           
           
          HopeCao 發(fā)表于: 2002/09/13 01:58pm
           
          strcpy
           原型:extern char *strcpy(char *dest,char *src);
           用法:#include <string.h>
           功能:把src所指由NULL結(jié)束的字符串復(fù)制到dest所指的數(shù)組中。
           說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。
                 返回指向dest的指針。
          memcpy
           原型:extern void *memcpy(void *dest, void *src, unsigned int count);
           用法:#include <string.h>
           功能:由src所指內(nèi)存區(qū)域復(fù)制count個字節(jié)到dest所指內(nèi)存區(qū)域。
           說明:src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向dest的指針。
          memset
           原型:extern void *memset(void *buffer, int c, int count);
           用法:#include <string.h>
           功能:把buffer所指內(nèi)存區(qū)域的前count個字節(jié)設(shè)置成字符c。
           說明:返回指向buffer的指針。
           
           
          編程浪子 發(fā)表于: 2002/09/15 09:38pm
           
          呵呵,各位都是高手,真是不厭其煩的諄諄教導(dǎo)??!
           
           
          obss 發(fā)表于: 2002/09/17 06:25pm
           
          謝謝,有些收獲
           
           
           

          posted on 2005-06-21 13:59 小力力力 閱讀(798) 評論(0)  編輯  收藏 所屬分類: C/C++
          主站蜘蛛池模板: 三江| 铜梁县| 虹口区| 灵宝市| 恩平市| 泸水县| 繁昌县| 定安县| 罗江县| 岳普湖县| 天门市| 普宁市| 六盘水市| 鸡东县| 梁山县| 故城县| 民丰县| 汉源县| 伊吾县| 长葛市| 安平县| 江达县| 新田县| 奉化市| 曲水县| 闵行区| 新乐市| 安龙县| 新沂市| 玛纳斯县| 曲水县| 武安市| 华蓥市| 鲜城| 凤台县| 连州市| 平原县| 淳化县| 达日县| 读书| 石狮市|