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宣告指標空間問題 int p new int 10 與int p new int
int p new int 10 開闢一個指標p p指的內容是一個整型,值為10 int p new int 10 開闢一個長為10的陣列,預設每個值都是0,p指向array的開頭 int p new int int p new int 10 int p new int 10 這三個有什麼區別,什麼...
c語言外部函式宣告與否問題,C語言函式宣告是要在主函式內部還是外部啊?
絕對是會的,每一個函式都有入口,作業系統 os 需要計算地址並且定址,然後每個子函式都有一個返回值,執行完os仍然有計算和定址,然後返回main,不過這種時間花費很小,並不比一次inta b c的運算多多少,因此不會犧牲很多時間,另外,這種微小時間的付出換來的確實程式的模組化和有序化,顯然是非常值得...
c語言指標陣列如何存放函式地址C語言指標陣列如何存放函式地址
c c 的指標的靈活,常把許多初學者搞暈,連高手也是如此。1.當然,可以呀,一切資料都可返回 2.複合指標型別直接表示非常麻煩 連高手都是這樣 可以分解成多個簡單型別 typedef void funtype void funtype num 100 分解後簡單多了!3.因為函式名不是字串,初始化時...