程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> c傳指針參數賦值方式

c傳指針參數賦值方式

編輯:關於C
1、malloc函數:向系統申請分配指定size個字節的內存空間,分配成功後得到的是一個內存塊,即連續的空間
   
    2、malloc分配不一定成功,所以最好驗證一下:
   
    char *mallo;
   
    if ((mallo=(char *)malloc(36*sizeof(char)))==NULL)
   
    printf(“error in mallo!\n”);
   
    3、傳指針參數的原理在譚浩強書上已經講過,這裡只是做傳指針後實際的賦值方式探討
   
    傳遞過來的參數:char *mallo
   
    3.1:mallo=“bag”;/*直接=不成功,調用後mallo只能在這個函數中打印出,調用這個函數的函數卻不能在調用後得到相應的賦值結果*/
   
    3.2:for(;i<36;i++)
   
    {
   
    *(mallo++)='a'+rand()%26;
   
    //mallo[i]='a'+rand()%26;/*這句和上句的效果相同*/
   
    }/*for循環可以成功:依次賦值隨進字母*/
   
    3.3:char *test=mallo;
   
    for(;i<36;i++)
   
    {
   
    *(test++)='a'+rand()%26;
   
    //test[i]='a'+rand()%26;
   
    }/*效果和3.2基本相同,只是讓思路更清晰的一種做法*/
   
    3.4:strcpy(mallo,“bag”);/*strcpy可以成功:strcpy會把“bag”中的三個字符和‘\0’一個一個的拷貝到mallo中,和上面的for循環類似*/
   
    一開始在Linux下這種方式並沒成功,在windows下添加#includes<string.h>後成功了(windows下沒有這個include會報錯),再回到Linux下也能賦值成功,估計可能是沒有#includes<string.h>的緣故,但
   
    奇怪的是,我再去掉#includes<string.h>,還是成功,原因便無從知曉了。
   
    4、源碼
   
    #include <stdio.h>
   
    #include <stdlib.h>
   
    #include <string.h>
   
    #include <memory.h>
   
    /*接受傳過來的指針,並通過幾種方式賦值*/
   
    void memtest(char *mallo)
   
    {
   
    int i=0;
   
    //char *test=mallo;
   
    printf(“===============================================================”);
   
    //printf(“\n*mallo:%s\n”,*mallo);
   
    printf(“\nmallo: %s\n”,mallo);
   
    /*for(;i<36;i++)
   
    {
   
    *(mallo++)='a'+rand()%26;
   
    mallo[i]='a'+rand()%26;
   
    }*//*for循環可以成功*/
   
    strcpy(mallo,“bag”);/*strcpy可以成功*/
   
    //mallo=“bag”;/*直接=不成功*/
   
    //printf(“test:%s\n”,test);
   
    printf(“\n\”bug\“ ->mallo: %s\n”,mallo);
   
    }
   
    void main()
   
    {
   
    char *mallo;
   
    if ((mallo=(char *)malloc(36*sizeof(char)))==NULL)/*申請空間*/
   
    printf(“error in mallo!\n”);
   
    //memset(mallo,1,sizeof(mallo));
   
    //mallo=“shanghaimizhuan”;
   
    printf(“mallo_main: %s\n”,mallo);/*打印申請空間內容,在windows下為亂碼,而Linux下不顯示*/
   
    /*以下打印數據在Linux和windows下數據不同,在賦值成功前windows已經會檢測上面分配的空間大小,Linux則不會:strlen(mallo)可以看出*/
   
    printf(“sizeof(mallo):%d--分割線--sizeof(*mallo):%d--分割線--strlen(mallo):%d\n”,sizeof(mallo),sizeof(*mallo),strlen(mallo));
   
    memtest(mallo);/*調用賦值函數*/
   
    printf(“===============================================================”);
   
    printf(“\nmallo_aftersetparam:%s\n”,mallo);/*tbw調用後輸出*/
   
    printf(“sizeof(mallo):%d--分割線--sizeof(*mallo):%d--分割線--strlen(mallo):%d\n”,sizeof(mallo),sizeof(*mallo),strlen(mallo));
   
    free(mallo);
   
    }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved