在c語言裡面宣告指標並用malloc賦值與與直接宣告變

時間 2021-07-08 21:32:48

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語言指標輸出 char str 2 printf c n , str printf x n , str printf x n ,str

在char str 2 中,str指向了字元 2 的地址,str的記憶體中裝的是字元 2 的地址,但自己也有一個地址,它的地址就是 str。getmemory str 傳入的是指標str自己的記憶體地址,而非它指向的地址 getmemory str 傳入的是指標str指向的地址,而非它自己的地址 首...

C語言陣列(指標)越界訪問,C語言指標越界問題,大神指教!!!

與編譯器無關,只與記憶體管理機制有關,是作業系統級別的問題,堆疊的讀取方式只是資料結構上的不同,在機器層面,依然是單純的記憶體讀寫操作 陣列越界訪問的危險性不好評估,但確實是最嚴重的危險之一 結果基本上會100 崩潰,但是崩潰的原因很可能不一樣,就算是同一段越界 跑幾遍,原因也可能是不一樣的 指標越...

C語言指標程式設計問題,求助大佬,C語言指標程式設計題,求助大佬

小黑哎啊 include int main int a 5 5 int p 5 定義一個整型指標p a 指標指向a的首地址 for int i 0 i 5 i for int j 0 j 5 j scanf d p i j p i j等價於 p i j 和 p i j 以及 p i j int ma...