1樓:
區別當然是有的
link n; 申明結構體實體
&n 結構體地址
link *n; 申明結構體指標
n=malloc(sizeof(link)); 讓結構體指標指向申請的記憶體空間,需要free釋放
後者需要釋放並且申請大小靈活
希望對你有幫助
2樓:戀v天真
首先你得明白malloc函式的作用;malloc函式是在記憶體中找到一個合適大小的記憶體空間來儲存資料,並讓指標指向這個空間的首地址。它的意義是在建立陣列時,可以建立動態陣列。
比如 int a[n],*p;p=a;是不合法的。而int *p;p=(int *)malloc(n*sizeof(int))卻可以實現建立這樣一個長度為n的陣列
3樓:百
有區別的。
malloc分配的記憶體是長期的,一直到free,你的指標指向的記憶體才會無效。
但是&n賦值給指標,離開link n所在的函式以後,指標指向的記憶體已經無效了,繼續使用的話會崩潰哦。
100分o(∩_∩)o
4樓:愛問西瓜愛答樹
當然有了。
link
link n;就是建立一個link的結構體,這個變數叫做n。&n表示link結構體n的首地址。
但是因為link是連結串列,裡面有個成員是指向一個結構體的指標。所以要用malloc分配空間,而malloc(sizeof(link));就是為這個地址分配一個可用的堆空間。
你可以開始定義一個 link l;但是l.next是指標,還是要用malloc為其分配空間。
因為這樣是不行。這樣定的話會是一個死遞迴,是非法的。
link
5樓:匿名使用者
區別在於&n是個區域性靜態的指標,是在棧中。malloc分配的是動態的,分配在堆區中。
c程式中編譯後的程式在載入後,棧中分配區域性變數空間,堆區是向上增長的用於分配程式設計師申請的記憶體空間。如果你在一個函式中一下子分配一個很大的資料,就可能導致棧溢位。
另外malloc用於分配大小不固定的連結串列,使用變數靜態分配的不夠靈活。
6樓:匿名使用者
區別是有的,直接宣告的變數儲存在連續的記憶體區域上,比如char a[5];char b[5];你可以用gets(a)輸入10個字元;使用malloc分配的記憶體區域不一定是連續(很大程度上不是連續的),他們是一塊一塊的記憶體區域,使用連結串列聯絡在一起。
直接宣告的變數儲存的區域叫做 棧(stack),使用malloc獲得的區域叫堆(heap)。
棧是連續高速而小的(1m,2m的都有,一般不超過2m),堆是不連續低速但容量極大的。
c語言中連結串列中的結構體指標變數問題。。。求教
7樓:
定義結構體指標變數時,只分配儲存指標型別需要的空間,比如listnode *p;這裡p有給他分配儲存指標的4個位元組的空間。
實際上你是要讓p指向一個結構體空間的,這個結構體空間在哪?
可以先定義listnode a;
然後 p=&a;
這時p指向一個之前申請分配過空間(編譯器設定過其地址和大小,在棧空間存放著了)。
現在我們要讓p指向一個臨時決定分配的空間(我們需要用來儲存輸入資訊或計算資訊),並讓p指向他,使得之後我們隨時通過p來訪問他。於是使用malloc先分配記憶體,並把malloc返回的地址賦值給p。在這裡,我們不能使用定義臨時結構體變數並讓p之前他(就如上面所說的p=&a),因為在子函式定義的變數,他們都是分配在子函式被呼叫時為其建立的棧空間,子函式退出時這些空間被釋放**,我們定義的變數生命結束,他們所在地址會被其他子函式被呼叫時建立棧空間所重用,那些地址很可能被新函式使用並修改所存資料。
這是我們不敢想象的,為了資料安全,必須使用malloc分配記憶體,因為malloc分配的記憶體是在堆空間分配,只有使用free後,其記憶體才會釋放,才能被其他地方重新分配。
8樓:匿名使用者
宣告結構體指標變數的時候,難道沒有為其分配記憶體嗎?
a:沒有,需要malloc
這和普通的指標分配沒有區別。
typedef struct stu
stu_t;
void main()
9樓:透明的沙漏
指標宣告的時候只是開闢了一個存放地址的記憶體,不管你這個指標是指向物件的還是char還是別的型別,指標宣告開闢的空間是一樣的,因為對於指標來說它存的只是地址,至於地址裡面的是char還是long對於宣告指標的記憶體是沒有關係的,所以如果指標要裝東西,需要malloc一個記憶體來存放char或者long型的東西
10樓:匿名使用者
在3kw的電爐盤上裝上5kw的爐絲可以嗎
c語言,怎麼用malloc申請一個100000個變數的字串陣列?
11樓:匿名使用者
這是一個二維陣列,所以要定義一個二維指標才能完成相應的操作
char **m ;
m = (char**)malloc(sizeof(char *) * 100000); //行數
int i=0;
for( i=0;i<100000 ;i++ )接下來,就和使用二維陣列一樣的操作m了,如:
strcpy( m[0], "hello" );
m[0][0]= 'h' ;
12樓:匿名使用者
可以通過以下語句實現:
char *p; //定義指標變數
p = (char *)malloc(100000);//申請空間並賦值給p。
解析:malloc為記憶體分配函式,其定義為void * malloc(size_t size);
功能為申請size大小的記憶體長度,並返回分配到的地址值。
而字元型別,每個元素佔1個位元組空間,所以100000個變數的總空間就是100000位元組,於是引數size為100000。
13樓:匿名使用者
#include
#include
#include
using namespace std;
// 申請的arr空間類似: #代表point *代表data; 那麼他就是一個 4行5列的資料
// #***** #***** #***** #***** //這是本來應該儲存的形態
// ####***** ***** ***** ***** //這是我們寫出來的結構 那麼解釋一下
// 第一個# 即頭指標arr, 第二個# 他指向了第第二組的頭 即第二行的首元素 第三個#指向了第三行的首元素 第四個#同理
// head即第一個*的位置
// 二維陣列 arr[i][j] 等價於 * ( arr + i ) + j; 又等價於 arr[i] + j; ( 此處arr[i]代表地址 )
template < typename type >
type ** new_array_2d( int row, int col ) //row是行 col是列
// this指標即為date -> func() 等價於 func( &date ), 隱含傳遞了this;
} // 現在arr[i][j] 的地址即為這個資料的指標
}return ( type ** ) arr; //返回這個陣列頭指標
}template < typename type >
void delete_array_2d( type ** arr, int row, int col ) //釋放二維陣列 row行 col列
}if( arr != null )
}int main()
}for( int i = 0; i < nrow; i++ ) //輸出二維陣列
cout << endl;
}delete_array_2d< string >( p, nrow, ncol ); //釋放記憶體
system( "pause" );
return 0;
}你申請的是一維的 你想要的是二維的 當然報錯
14樓:修和玉於旋
這是以前我寫的**,字串存在buffer指標所在的緩衝區中intreadbuffer(char
**buffer)
free(buftemp);//釋放
buffer[buf_totalcount-1]='\0';
//填充結束符
returnbuf_totalcount-1;//返回實際字串的長度
}希望對你有幫助
關於在c語言宣告帶有變長陣列引數的函式
在c語言中,函式中要用陣列做引數,可以採用三種方式,其中後兩種均可適用於變長陣列引數。1 直接以定長陣列做引數,宣告形式為 ret type func int a 100 這裡就是以100個元素的陣列做引數的。2 宣告時不帶長度,即 ret type func int a 3 以指標替代陣列,即 r...
在C語言中,當形參和實參都為指標時,在函式中傳遞的是地址嗎
是的,指標這玩意兒,就是專門和地址掛鉤的!這程式是你寫的嗎?要是你寫的話 你就看下面的三段話 就能找出。1.比如你定義一個函式void add int a,int b 這裡的a和b就是形參。2.當你進行函式呼叫的時候,add 1,2 這裡的1和2就是實參。3.形參就是沒有賦值的變數,實參就是有賦值的...
在C語言中,指標是怎樣通過形參改變實參的?怎樣理解?如果此處難講清楚,可以讀什麼文章?請指教
這個要從傳值和傳指標呼叫區別說起.首先,每個函式的形參,都相當於一個函式的區域性變數.那麼傳值呼叫時,比如函式 fun int a 的時候,呼叫fun b 相當於新建了一個區域性變數int a b 然後 改變a的值自然不會改變b.而傳指標呼叫,比如 fun int p 這時呼叫fun q q是另外一...