1樓:金色潛鳥
沒有太多的道理。
這是c語言 實參 呼叫方法 帶來的 困惑。
通過函式引數只能把值傳回來,不能把位址帶回來。
除非用 getmemory(char **p) 可以通過函式引數把位址帶回來。但語法上,不如通過函式返回指標好理解。
char * getmemory(char *p) 通過函式返回指標,能把位址送回來。(記住這種方法。)
str=getmemory(str);
printf("str size: %d\n",_msize(str)); // 可以列印出分配了多少記憶體單元。
「引用」是 c++裡的概念。這裡不討論。
2樓:
沒有返回值的getmemory(str)怎麼會給str賦乙個指標?錯誤!只有有返回值的getmemory(str)才能把它分配的記憶體首位址傳給主程式中的str指標。
這樣str才有具體指向,下面的strcpy才能正確執行,不然就是給空指標寫資料,當然要報錯……
3樓:匿名使用者
傳遞指標的引用就可以了:
void getmemory(char *&p)
你要把乙個位址傳出來,直接用指標是不行的,如果是傳乙個數值出來,你可以用這個數的指標或者引用。同理要把位址傳出來就得用指標的引用或者是指標的指標。
4樓:匿名使用者
告訴你吧,這就是實參和形參的區別,getmemory(str),僅僅是把str的數值賦值給了getmemory(char*p)中的這個p形參,str本身並沒與變,因為c語言函式呼叫是傳值呼叫,就是把實際變數的值賦值給形式引數,並不是傳遞實際的變數給函式的引數
5樓:孟戈大猛
strcpy(p,"hello world"); 哪來的p應該是str
c語言中的動態記憶體分配的用法舉例
6樓:匿名使用者
1、malloc函式:其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。其引數是乙個無符號整形數,返回值是乙個指向所分配的連續儲存域的起始位址的指標。
2、free函式:由於記憶體區域總是有限的,不能不限制地分配下去,而且乙個程式要盡量節省資源,所以當所分配的記憶體區域不用時,就要釋放它,以便其它的變數或者程式使用。這時我們就要用到free函式。
3、calloc函式:其作用是在記憶體的動態儲存區中分配n個長度為 size 的連續空間。函式返回乙個指向分配區域的起始位置的指標;如果分配不成功,則返回null。
擴充套件資料:
函式運算子:
new指標變數=new 資料型別;
例如:int *p=new int
該語句的作用是會用new從記憶體中申請了乙個int型變數(4個位元組),並將該變數的首位址賦給指標變數p。
new所建立的變數的初始值是任意的,也可在用new分配記憶體的同時進行初始化。使用形式為:
指標變數=new 資料型別(初始值)。
delete
堆記憶體可按照要求進行分配,程式對記憶體的需求量隨時會發生變化,有時程式在執行種可能會不再需要由new分配的記憶體空間,而且程式還未執行結束,這時就需要把先前占用的記憶體空間釋放給堆記憶體,以後重新分配,供程式的其他部分使用。運算子delete用於釋放new分配的記憶體空間,刪除建立的物件,它的使用形式為:
delete 指標變數;
其中的指標變數中儲存著new分配的記憶體的首位址。
7樓:**的可樂
要實現根據程式的需要動態分配儲存空間,就必須用到以下幾個函式
1、malloc函式
malloc函式的原型為:
void *malloc (u igned int size)
其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。其引數是乙個無符號整形數,返回值是乙個指向所分配的連續儲存域的起始位址的指標。還有一點必須注意的是,當函式未能成功分配儲存空間(如記憶體不足)就會返回乙個null指標。
所以在呼叫該函式時應該檢測返回值是否為null並執行相應的操作。
下例是乙個動態分配的程式:
#include
#include
main()
for (count=0;count〈10;count++) /*給陣列賦值*/
array[count]=count;
for(count=0;count〈10;count++) /*列印陣列元素*/
printf("%2d",array[count]);
}上例中動態分配了10個整型儲存區域,然後進行賦值並列印。例中if((array(int *) malloc(10*sizeof(int)))==null)語句可以分為以下幾步:
1)分配10個整型的連續儲存空間,並返回乙個指向其起始位址的整型指標
2)把此整型指標位址賦給array
3)檢測返回值是否為null
2、free函式
由於記憶體區域總是有限的,不能不限制地分配下去,而且乙個程式要盡量節省資源,所以當所分配的記憶體區域不用時,就要釋放它,以便其它的變數或者程式使用。這時我們就要用到free函式。
其函式原型是:
void free(void *p)
作用是釋放指標p所指向的記憶體區。
其引數p必須是先前呼叫malloc函式或calloc函式(另乙個動態分配儲存區域的函式)時返回的指標。給free函式傳遞其它的值很可能造成宕機或其它災難性的後果。
注意:這裡重要的是指標的值,而不是用來申請動態記憶體的指標本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……free(p2) /*或者free(p2)*/
malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作為free函式的引數。
malloc函式是對儲存區域進行分配的。
free函式是釋放已經不用的記憶體區域的。
所以由這兩個函式就可以實現對記憶體區域進行動態分配並進行簡單的管理了。
8樓:
例如malloc,zizeof,free等原型:extern void *malloc(unsigned int num_bytes);
用法:#include
功能:分配長度為num_bytes位元組的記憶體塊說明:如果分配成功則返回指向被分配記憶體的指標,否則返回空指標null。
當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
舉例:// malloc.c
#include
#include
main()
9樓:匿名使用者
#include
#include
#define str_len 4096
int main ()
c語言如何動態分配二維陣列??
10樓:
一、二維資料的記憶體空間動態分配
方法一:
首先arr是乙個二級指標,為arr分配xdim空間,每一維都是乙個指向陣列的指標,且每個陣列內部的位址空間是連續的,但是陣列之間的位址空間沒有連續性。
這種分配方法在記憶體中的布局如下:
方法二:
這種方法相當於動態分配了乙個一維的連續的空間,然後讓相應的陣列指標指向某些固定的位置達到呼叫的目的。
這種分配方法在記憶體中的布局如下:
二、二維資料的記憶體空間釋放
對於第一種分配方式需要乙個乙個釋放,對第二種方式只要分配兩個指標即可。
三、完整**
11樓:匿名使用者
使用malloc函式,先分配第一維的大小,然後再迴圈分配每一維的大小。
示例**,分配3行4列二維陣列:
#include
#include
int main()
//初始化
for (i = 0; i < 3; ++i)}//輸出測試
for (i = 0; i < 3; ++i)printf ("\n");
}//釋放動態開闢的空間
for (i = 0; i < 3; ++i)free(a);
return 0;}/*
輸出:0 1 2 3
1 2 3 4
2 3 4 5*/
12樓:
假設你要定義3行4列的陣列
int **a;
n=3,m=4;
a=(int**)malloc(n*sizeof(int*));
for(j=0;j a[j]=(int*)malloc(m*sizeof(int*)); 釋放的時候也要先釋放列後釋放行 for(j=0;j free(a[j]); free(a); a=null;最後給他賦個零。 ok分給我吧 13樓:匿名使用者 如果p是這樣char **p;定義的。 那好像*p=(char **)malloc(1000*sizeof(char *));要改成p=(char **)malloc(1000*sizeof(char *)); 怎麼實現c語言裡面陣列的動態分配? 14樓:風若遠去何人留 1 定義指標。 2 使用malloc函式分配記憶體。 3 對陣列進行訪問即可。 對於一維動態陣列,直接定義一維指標,並分配記憶體空間即可。 比如int型別的10個元素動態陣列,寫作 int *a; a = (int *)malloc(sizeof(int) * 10); 如果是多維陣列,需要從高維向低維逐層分配。如二維陣列10*100空間。 int **a; int i; a = (int **) malloc(sizeof(int *) * 10); // 先分配10個int*的空間。 for(i = 0; i < 100; i ++) a[i] = (int *)malloc(sizeof(int) * 100); // 對於每個int*,分配100個元素的空間。 15樓:施小平 /* 這是一維陣列,二維陣列類似 int **p= (int**)malloc(m*sizeof(int*) ); int i ; for(i = 0; i < m; i++)vc6.0中通過 */ #include #include void main() printf("\n"); for(i=0;i
printf("\n");} 16樓:匿名使用者 #include int **a = (int**)malloc(sizeof(int*) *m); int i ; for(i = 0; i < m; i++) 17樓:匿名使用者 全都malloc不free?有你們的 那樣賦值也只能用可變參了.void set int value,int num,int b int malloc 3 sizeof int set b,3,4,5,6 set 設定變數,設定的數量,值1,值2. 1 當成普通陣列使用,用for迴圈即可賦值。2 例程 include include i... 風若遠去何人留 變數的地址,在c語言中,一般寫作指標型別。不同型別的變數地址,用不同的指標進行儲存。比如,char 型別的地址,使用char 儲存,而int型地址,用int 儲存。除此外,部分情況下也會採用整型型別來儲存變數地址,具體使用何種整型型別,取決於編譯器 1 16位編譯器,地址佔16位,2... 星月小木木 strtok函式會破壞被分解字串的完整,呼叫前和呼叫後的s已經不一樣了。如果要保持原字串的完整,可以使用strchr和sscanf的組合等。strtok是乙個執行緒不安全的函式,因為它使用了靜態分配的空間來儲存被分割的字串位置 執行緒安全的函式叫strtok r,ca。運用strtok來...c語言如何給動態分配的陣列賦值,C語言如何給動態分配的陣列賦值
c語言中變數的地址是什麼型別的,C語言中變數的地址是什麼型別的
c語言中strtok用法,C語言中strtok用法