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

2021-07-08 21:32:21 字數 4337 閱讀 6897

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.因為函式名不是字串,初始化時...