1、malloc函數(shù):向系統(tǒng)申請(qǐng)分配指定size個(gè)字節(jié)的內(nèi)存空間,分配成功后得到的是一個(gè)內(nèi)存塊,即連續(xù)的空間
2、malloc分配不一定成功,所以最好驗(yàn)證一下:
char *mallo;
if ((mallo=(char *)malloc(36*sizeof(char)))==NULL)
printf(“error in mallo!\n”);
3、傳指針參數(shù)的原理在譚浩強(qiáng)書上已經(jīng)講過,這里只是做傳指針后實(shí)際的賦值方式探討
傳遞過來的參數(shù):char *mallo
3.1:mallo=“bag”;/*直接=不成功,調(diào)用后mallo只能在這個(gè)函數(shù)中打印出,調(diào)用這個(gè)函數(shù)的函數(shù)卻不能在調(diào)用后得到相應(yīng)的賦值結(jié)果*/
3.2:for(;i<36;i++)
{
*(mallo++)='a'+rand()%26;
//mallo[i]='a'+rand()%26;/*這句和上句的效果相同*/
}/*for循環(huán)可以成功:依次賦值隨進(jìn)字母*/
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會(huì)把“bag”中的三個(gè)字符和‘\0’一個(gè)一個(gè)的拷貝到mallo中,和上面的for循環(huán)類似*/
一開始在Linux下這種方式并沒成功,在windows下添加#includes<string.h>后成功了(windows下沒有這個(gè)include會(huì)報(bào)錯(cuò)),再回到Linux下也能賦值成功,估計(jì)可能是沒有#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循環(huán)可以成功*/
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)/*申請(qǐng)空間*/
printf(“error in mallo!\n”);
//memset(mallo,1,sizeof(mallo));
//mallo=“shanghaimizhuan”;
printf(“mallo_main: %s\n”,mallo);/*打印申請(qǐng)空間內(nèi)容,在windows下為亂碼,而Linux下不顯示*/
/*以下打印數(shù)據(jù)在Linux和windows下數(shù)據(jù)不同,在賦值成功前windows已經(jīng)會(huì)檢測(cè)上面分配的空間大小,Linux則不會(huì):strlen(mallo)可以看出*/
printf(“sizeof(mallo):%d--分割線--sizeof(*mallo):%d--分割線--strlen(mallo):%d\n”,sizeof(mallo),sizeof(*mallo),strlen(mallo));
memtest(mallo);/*調(diào)用賦值函數(shù)*/
printf(“===============================================================”);
printf(“\nmallo_aftersetparam:%s\n”,mallo);/*
tbw調(diào)用后輸出*/
printf(“sizeof(mallo):%d--分割線--sizeof(*mallo):%d--分割線--strlen(mallo):%d\n”,sizeof(mallo),sizeof(*mallo),strlen(mallo));
free(mallo);
}