定義乙個結構體指標需要分配儲存空間?

2021-07-25 23:46:24 字數 2314 閱讀 5497

問題的**於在學資料結構的時候,c++的語法和c語言的語法竟然不一樣。

1.首先函式的引數有兩種傳遞方式,乙個是值傳遞,乙個是位址傳遞。當指標作為引數傳遞的時候,即為位址傳遞,但c++寫的時候需要加&引用符號,而c語言卻不用。

看到一篇文章是這麼寫的

問題描述:

主題:定義結構體指標時,有沒有同時分配儲存空間

定義結構體指標時,有沒有同時分配儲存空間啊?

看到結構體的陣列定義好以後就直接可以用了。

但是結構體指標在鍊錶中還要malloc()申請空間。

這是為什麼啊?

1樓

定義結構體指標時並沒有分配儲存空間,所以要用malloc()申請空間。

2樓

很明顯,你還沒有搞清楚什麼是指標,至於結構體變數和結構體指標,更是很混淆,所以這裡不是因為陣列的問題。

舉個例子:

//下面僅僅是定義乙個型別,不會產生變數,所以不存在分配空間的問題

struct data

;void main(void)

3樓

宣告任何物件並定義變數,包括指標都會開闢空間,除了靜態成員在乙個特別的區,其他的在棧上開闢空間,不用了自動清理,用malloc, realloc, calloc, new new開闢空間是動態分配空間,在堆上進行。值得說明的是,棧空間很小(相對於堆而言),很"昂貴",但是通常執行更快。

在windows下,乙個程序的棧在最高端,向下增長,堆在棧下面,向棧的方向增長,下面是資料和**。linux下記憶體布局由開發工具和作業系統合作負責,這四個部分相對位置布局不確定。

-------------------- |

|棧                 v v

v-------------------- ^

^堆                 | |

|-------------------- 其他

4樓

windows預設棧大小是1m

棧和堆是共享一記憶體的,可以調節它們的比例。來設定棧和堆的大小。

不過一般情況下,還是用不著的。。

5樓

[quote]

有人告訴我:

a a[3];  a是a型的,有3個,當然分配a乘3大小的空間

a* a;    a是a*型的,當然只分配a*大小的空間,而不會分配a大小的空間

好像跟你說的不太一樣,結構體陣列的話,我在課本裡看到的確不用再次申請空間了啊[/quote]

結構體變數分配結構體本身大小的空間,結構體指標分配4個位元組,其實任何型別的指標都是分配四個位元組的指標空間。

所以:a a[3]; //a裡面是三個a變數,所以分配三個結構體大小

a *a;  //a是乙個指標,分配4個位元組,就算a再大,a也只是4個位元組,因為任何型別的指標都是4個位元組。要使用a,必須先要對指標初始化,也即分配空間了。 如:

a *a;

a = (a*)malloc(sizeof(a));

我們完全可以撇開結構體,把問題簡單化成int型別來說明這個指標問題:

int a1[10];

int *a2;

很容易知道,a1是包含10個int的陣列,大小也就是10*sizeof(int)。我們可以直接使用a1不要在進行什麼初始化或者分配空間的遊戲,因為陣列a1裡面本身存放的就是int變數本身了。

然後a2,是乙個int*的東西,也就是整型指標,a2不能存放int變數,它只能存放位址,乙個int變數的位址。如果要使用a2,必須首先對a2初始化,即將它指向乙個int變數的位址,如:

a2 = (int*)malloc(sizeof(int)); 或者

int i = 10;

a2 = &i;

所以,malloc函式的作用是首先宣告乙個變數,然後返回該變數的位址。

所以:a2 = (int*)malloc(sizeof(int)) 的含義就是把該變數的位址賦值給a2,和a = &i 本質上並沒有什麼不同,只是乙個變數是棧上,乙個是堆上,都是乙個位址賦值。

所以,所謂的分配空間,就是對指標賦值,把乙個變數的位址賦值給乙個指標。

----------我是萌萌噠分割線----------

很明顯三樓和四樓講的有點底層了,不過其他樓層說的很明白,首先只是分配了指標本身的儲存空間,指標指標還沒有被賦值,通過new或者malloc()語句是為了給結構體變數分配記憶體空間,即為指標賦值,即指標指向的內容的資訊,便有了指標指向的資料內容和空間。

----------我是萌萌噠分割線---------- 

C C 語言結構體中定義另乙個結構體指標的經驗

本文進行討論的是,在linux中,c c 語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,比如struct person 這個結構一攜帶的就是乙個人的兩個基本資訊,年齡 age 和身高 height 同樣你也可以繼續新增人的相關資訊進去,比如學號,班...

C C 語言結構體中定義另乙個結構體指標的經驗

本文進行討論的是,在linux中,c c 語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,比如struct person 這個結構一攜帶的就是乙個人的兩個基本資訊,年齡 age 和身高 height 同樣你也可以繼續新增人的相關資訊進去,比如學號,班...

C C 語言結構體中定義另乙個結構體指標的經驗

本文進行討論的是,在linux中,c c 語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,比如 cpp view plain copy struct person 這個結構一攜帶的就是乙個人的兩個基本資訊,年齡 age 和身高 height 同樣你也...