C程式設計 為什麼指標一定要malloc分配空間

2022-02-06 18:50:13 字數 3873 閱讀 2393

1樓:gta小雞

你需要分清「指標所佔用的記憶體空間」和「指標指向的記憶體空間」之間的區別。指標變數需要儲存它所指向的記憶體位址,涉及到儲存就需要空間,例如在64位程式中,任何乙個指標變數都佔用64位即8位元組的記憶體空間。而指標所指向的記憶體空間,指的是根據指標變數中儲存的記憶體位址定址到對應位置的記憶體空間。

這就好比房間和門牌號的關係,門牌號需要寫在乙個牌子上,這個牌子就是指標變數所佔用的記憶體空間,而房間本身則是指標變數指向的記憶體空間。

第二,sizeof關鍵字的結果是在編譯期就計算好的,對於double型別的指標p來說,sizeof(*p)就是sizeof(double),而double型別佔用8個位元組,這是在編譯時就確定的,和p具體指向**是完全沒有關係的,也就是說在這個程式執行之前,sizeof(*p)就已經確定是8。

「可以*p=5這樣賦值」,這是不可能的,原因很簡單,double *p只是定義了乙個指標變數p,此時變數p中的內容也就是p所指向的位址是完全不可預知的,此時向p所指向的記憶體空間直接寫入資料,是未定義行為,結果是不可預知的,程式很有可能因此崩潰。而malloc的作用,就是向作業系統申請一塊可用的記憶體空間,再令p指向這片記憶體空間,就可以像其中寫入資料了。

2樓:匿名使用者

type * p;這句話是分配了乙個變數p,這個變數可以儲存位址,這個位址是乙個type型別的儲存單元,分配給p的是乙個指標型別的儲存單元,比如通常是乙個unsigned int型別的單元用於存放位址;並且其中的內容沒有被初始化,也就是位址不明,p在此時無法直接使用。

通常用法:

double a; //自定義乙個double型別儲存單元,其別名為a,位址未知

double *p; //自定義乙個指標變數p,可以用於指向double型的儲存單元

p=&a; //讓系統計算變數a的位址賦值給變數p,則可以操作p指向的單元,也就是a變數的單元了

*p=1.0; //相當於a=1.0

3樓:匿名使用者

double *p中p變數中儲存的是記憶體位址值,這個位址值是8個位元組;

malloc是將執行棧中一塊未經使用的空間的首位址返回,並將這個空間標記為已用,你對這個空間內容的操作都是通過這個首位址進行的,首位址的數值對應於你的例子中p的內容;

double *p=5或者p=5,是人為指定記憶體位址值5,在不清楚5這個位址下的記憶體空間中儲存的內容是什麼或有什麼作用的情況下,就對這個空間進行操作是邏輯錯誤,多數情況會導致程式崩潰。

4樓:幻形術

int main()

c語言中,怎麼使用malloc函式為陣列指標分配空間 比如要為char *p[ ]分配空間,應該怎麼弄

5樓:

指標陣列和陣列指標是兩個不同概念,你這裡給出的定義例項實際上是指標陣列的定義。

指標陣列是指所定義陣列的每個陣列元素都是乙個相應資料型別的指標,開設空間的操作可以應用迴圈語句進行,例如:對於char *p[10]; 可以應用

for(i=0;i<10;i++)

p[i]=(char *)malloc(sizeof(char)*n); //為每個指標申請開設n字元的儲存空間

開設後,對於p的使用與二維陣列的使用格式類似,可以有效的使用兩個下標,

如 p[0][0]='a';

還可以像每個指標中賦值字串: p[2]="beijing"; 當然字串長度應該小於n。

而陣列指標,是指定義為指向某個固定大小順序空間的指標,定義的格式如下:

char (*pa)[10]; //定義乙個指向擁有10元素的字元陣列的指標,

int (*p)[10];

應用格式可以參考下述程式,申請空間、賦值、輸出後,可以觀察到100被賦值到第五行第十個元素,指標可以像二維陣列一樣通過兩個下標引用所申請開設的空間。

#include

main()}

c中指標變數何時需要初始化malloc

6樓:匿名使用者

指標是用來操作記憶體的。

c語言的記憶體模型包含有棧和堆兩部分。

棧存放的是函式執行時的變數等,這部分變數由系統自動管理,比如 int a;等,這些變數在函式體結束時自動收回。

堆存放的是由使用者自己手動管理的變數,這些變數是的由malloc函式建立,由 free函式釋放。不會在函式體結束時自動收回。

7樓:

個人認為

char *p;

此時p指標已經分別分配了乙個記憶體空間,這個空間大小等於指標大小,不同位數的機器上有所不同(64位機器指標大小為8位元組);此時這個空間就只能儲存乙個8位元組的值,所以你可以把temp複製給它。

至於何時需要申明malloc來分配記憶體空間,這就要看你需要儲存的值大小了,假如你需要儲存10個char型的值,乙個char佔乙個位元組所以預先記憶體大小不夠了,就需要

p = (char *)malloc(10*sizeof(char));

p[0] = ?;

p[1] = ?;

......

當然了如果有乙個現成指向10個char型的指標s,直接p = s就行了。

8樓:匿名使用者

1.struct item

{char *name;

...其中name作為字串其長度未定義,雖然符合語法(指標本身就沒有要求定義長度的)。對於這種未賦初值的字串,需要定義乙個有長度的陣列。

改成char name[20];

我明白樓主的意思,是想定義乙個長度不固定的字串,但是這是c,pchar型別的並不是嚴格意義上的串,建議使用c++中的string型別,可以不定義長度。

2.scanf/printf在字串引用時應使用指標形式,所以應該是check.name

另外,團idc網上有許多產品**,便宜有口碑

9樓:匿名使用者

指標其實就是乙個位址變數. p = temp; 是對指標變數p了賦值為temp[0]的位址, 也就是說不是必須的, 但是乙個好的習慣,

10樓:匿名使用者

來晚一步。zadecn回答的比較透徹。

11樓:瘋狂的表弟

daimm_know 解答得挺好。。。

c語言定義乙個結構體指標變數跟定義該指標變數之後再呼叫malloc為其分配記憶體之後有什麼不同? 150

12樓:

你的「分配bai記憶體」

的概念du有點問題——不是用malloc為某zhi個指標分配dao了記憶體,而是先用

專malloc分配了記憶體,再將屬

13樓:

其本質實是沒有區

bai別的。

都是這du種型別的指標。

唯一zhi的區別在於。p1不指

dao向任回何位址。p2指向了答某段有效的記憶體。

連結串列中,定義乙個指標,是為了讓其記錄下首位址,遍歷完成後,head依然是head,不然的話,你用head去遍歷,到最後 你就只剩下乙個節點了 。 防止記憶體洩漏。

c語言為字元指標(char*)分配動態記憶體空間(malloc),為什麼空間不發生變化 10

14樓:匿名使用者

char*是指標,你獲取指標(位址)的長度,32位機器當然是4。

c語言malloc分配出來的記憶體是不能通過sizeof獲取長度的。

c語言 malloc分配給字元指標記憶體,需不需要多分配乙個給『\0』?

15樓:閥門資本

不需要,\0內部自動會分配的。按照位元組長度給指標分配記憶體即可

為什麼一定要經濟增長,我國經濟為什麼一定要保證GDP的增長幅度?

錢不是萬能,但是沒錢就是萬萬不能。缺錢,基本都導致幸福感降低,有一定的經濟基礎的人基本有足夠的幸福感。經濟增長才能帶來經濟收入,民眾收入增加,才會增加幸福感。民眾幸福了。國家才會穩定。所以,經濟增長是必須的。不增長就相當於落後,你不增長,別的國家在增長,你經濟衰落,軍事就更跟不上,落後就要挨打。人民...

為什麼一定要成為優秀的人,為什麼一定要成為乙個優秀的人

上天堂和下地獄,大多數人都會選擇上天堂,不做乙個優秀的人,就只能和下地獄乙個意思了。自甘墮落的表現。你應該說為什麼我們要成為乙個有錢人。因為錢是萬能的。成為乙個優秀的人是為了賺錢。世界就是這樣子的少看手機多看書,不這樣以後 為什麼要成立乙個優秀的人?如果。成為乙個優秀的人。是很多人會讚賞了回他的。也...

人們為什麼一定要結婚?人為什麼一定要結婚呢

男女結婚同樣是一種優勝劣汰的競爭。動物之間的性權力是通過武力換得的,只有身體更健康 更強壯的動物能夠獲得性權力,能夠繁衍後代,人類則有區別於動物,雖然健康也是男女結婚的基本條件,但聰明卻是男女結婚前成為最重要的選擇條件,當然,隨著人類的發展,權力和金錢是更重要的條件,但健康和聰明絕對是所有年輕男女選...