char指標變數分配空間,char陣列與char指標的記憶體分配空間

時間 2022-11-25 21:50:55

1樓:樂正涵柳

1,char指標不一定必須分配空間才能賦值,比如char ch = 'a';

char *p;

p = &ch;

或者char *str = null;

str = malloc(4);

if(str != null)

2,memset不是用來分配空間的,而是分配空間之後用來初始化空間的。

比如char *p=malloc(sizeof(int));

memset(p, 0, sizeof(int));

第一行分配乙個int型變數所佔的大小的空間(4個位元組)給p第二行表示把p分配到的4個位元組給初始化為0;

不過一般好的習慣是:

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

if(p != null)

因為並不是每次malloc都能成功分配到記憶體的,所以每次使用指標之前必須判斷是否為null

2樓:

1.指標變數只是佔據乙個int的空間用的時候不一定非要分配空間,而且你說的分配空間指的是int裡面內容所指向的空間。

2.不可以使用,沒有分配空間是不可以使用memset來初始化的

char陣列與char指標的記憶體分配空間

3樓:匿名使用者

char rp[100]定義乙個字元數量為100的陣列,程式編譯或執行時會分配100個字元空間

char *rp;定義乙個指向字元的指標,程式編譯或執行時,會分配乙個指標的空間,在32機上,通常也就是4位元組。

說自動分配也是可以說得過去的。

說到空間分配,也就是記憶體管理。

通常有兩種狀況,一種是靜態分配,(此種方式是編譯器與系統自動分配的)

如我們通常定義的int a;這也分為兩個狀況。

如果int a;定義成全域性變數,那麼a 會在系統為程式分配的空間中。

如果int a;定義在函式內,那麼a就會在程式的堆疊中。

另一種是動態分配,也就是程式在執行時向系統申請記憶體操作。主要是為了更好更靈活的對記憶體進行管理。

你執行這個操作的時候rp執行的記憶體是0,沒有分配啊,當然無法使用這塊記憶體。

應該說是rp指向的記憶體是非法的

雖然rp=0,算是一種初始化操作,但是沒有給rp賦是乙個真正的可用位址值,那麼就不能把rp當成指標,並訪問其位址。

p = tmp;並不是說,p把tmp陣列複製了乙個副本,而只是p中的值成了了tmp的位址(p指向tmp)。你可以把p理解成只是tmp的乙個別名,就像乙個人有兩個名字,但不管如何人卻是只有乙個的。

初始化乙個可用的指標變數,唯一的方法就是給它賦上乙個合法的記憶體位址,不管是記憶體申請函式返回的記憶體位址,還是已有的記憶體位址。我們最終總會是把乙個合法的記憶體位址賦值給這個指標變數。

int *p,*k,v;

p=malloc(sizeof(int));

k=&v;

k=p;

這些只是形式上的不同而已,反正乙個可用的指標指向的一定是乙個合法位址。

4樓:匿名使用者

宣告陣列時就會為這個陣列裡將存的資料分配記憶體,而宣告指標只會分配一塊記憶體,用以儲存以後指向的記憶體的位址

5樓:夔澄

陣列本身編譯系統就會給它分配記憶體。而指標僅僅是乙個指向一塊記憶體的位址變數。

6樓:

若定義為char rp[100],編譯器會在棧上為陣列變數rp分配100位元組的記憶體;

如果定義為char * rp, 編譯器會在棧上為指標變數分配sizeof(char*)大小的記憶體,通常為4位元組;如果要使rp有效,rp指標必須指向有效的記憶體位址,這時,你可以為它另外在堆上分配記憶體,或者指向另外乙個字串

7樓:

陣列空間是靜態分配的,(就是在編譯前就已經有了空間)而指標宣告時不指向任何記憶體;也就不能對其所指記憶體賦值了;

你可以這樣

#include

#include

#include

void main()

else

printf("p=[%s] len=[%d]\n", rp, len);

free(rp); //釋放rp所指記憶體空間} 我上面說錯了,指標宣告時如果不初始化,都是指向同乙個記憶體:

0xcccccccc(十六進製制)

而這塊內存在系統中是不可寫的(就是不能為其賦值)對的,其實就是兩種方式

1,動態分配記憶體

2,為指標變數賦值

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

8樓:

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

指標陣列是指所定義陣列的每個陣列元素都是乙個相應資料型別的指標,開設空間的操作可以應用迴圈語句進行,例如:對於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語言為字元指標(char*)分配動態記憶體空間(malloc),為什麼空間不發生變化 10

9樓:匿名使用者

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

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

關於c語言中,指標變數與char int double等變數分配記憶體的問題??

10樓:匿名使用者

1全部lz的理解基本是正確的。不過有些概念上的欠缺,補充一下:

位址是表示儲存器中儲存單元位置的非負整數。所有可用的位址的集合稱為位址空間。現代的編譯器中,物件指標的值是同一位址空間的元素。在32位編譯器中,這個值的上限是2^32-1。

物件是執行期記憶體中的資料儲存區域,這片區域是連續的。指標指向物件,則它的值等於物件的首個位元組的位址。物件的大小可以在編譯期根據型別確定,因此在確定的時刻,指標(包含被指物件的型別)可以唯一地確定物件的儲存。

指標:一類型別的統稱。指標型別的例項是表示式,可能是乙個物件。有時候把指標物件簡稱為指標,注意不要混淆。

左值和右值:表示式中的左值具有物件語義,而右值沒有。通俗點說左值可以出現在賦值操作符=的左邊,而右值不可以(c語言中右值可以簡單地理解成值)。

&操作符作用於乙個左值,獲得乙個右值指標。

物件位址作為按位元組編址的記憶體單元的編號,最小單位是1(對應於乙個位元組),且必定是位址空間內的元素。指標的值用來表示位址。所以,指標不能指向小於乙個位元組的儲存區域(位段),使用&操作符試圖獲得指向它的指標是非法的。

char a[3],*p;宣告了兩個物件:型別為char[3]的a、型別為char*的p。p=a;使p的值等於a——由於p和a的型別不同,所以顯然發生了靜態型別轉換才能保證表示式的合法性。

表示式a在這裡並不作為左值而是隱式地轉換成乙個char*型別的指標(不是物件,而是臨時物件,或者精確地說,乙個不在執行期佔據儲存空間的右值),等於&a[0]的值,即a[0]的位址。注意陣列元素的位址是編譯期就能確定的常量,所以並不需被分配空間,不用儲存在物件中。陣列a的位址&a(由於陣列的儲存方式,這個值等於&a[0]的值)作為常量直接被編譯到目標**中,而不是在執行期再計算出來。

這裡需要計算的是&a[i],因為i的值是不能在編譯期唯一被確定的。&a[i]相當於a+i,a在這裡同樣隱式轉換為指標右值。根據指標的加法規則,a+i等於(char*)((int)a+sizeof(char)*((int)i))(這裡用顯式型別轉換指出表示式的型別,下同)。

同時,p是和a對應型別的指標,它每次被++後,效果相當於p=(char*)((int)p+sizeof(char)*1)。由於i每次增加1,因此可見增加的部分的數值是同步的;而p=a導致它們的初值是相等的。因此迴圈體中每次輸出的值相等。

====

[原創回答團]

11樓:匿名使用者

因為現在大部分電腦都是32位的系統,也就是有2的32次方個記憶體位址,所以每個位元組的記憶體位址就需要用32位整數來表示,也就是乙個32位的位址要用4位元組儲存。所以指標變數都是佔4位元組。

12樓:有種孤獨叫寂寞

乙個位元組有8個二進位制位,4個位元組就是32位,32位機的最大記憶體定址範圍就是32位,所以乙個指標佔4個位元組完全夠存乙個指向任何記憶體的位址,至於這個位址存多少位元組和指標無關,指標與記憶體關係就好比乙個位址與倉庫一樣,倉庫存多少東西,和位址沒有任何關係。

上面"&a[i]取的是位址,4個位元組,p++,p也是完整位址,不是乙個位元組,4個位元組指標是個整體,不能被拆分。

char *pc;請問編譯程式要為指標pc變數分配幾個位元組的記憶體空間,為什麼

13樓:匿名使用者

一般是乙個機器字長度(多為4位元組,32位)。你可以用 sizeof(pc)試試啊。如果你了解編譯模式就知道了,一般都是near模式。

14樓:匿名使用者

不同編譯器的處理時不同的,一般使用與整形型別相同的長度.

可以參考侯捷老師翻譯的《c++物件模型》,裡面對這些介紹的很仔細。

15樓:匿名使用者

char *pc = new char[陣列長度]

怎麼給指標陣列動態分配空間 比如定義了 char *array[] 怎麼給它分配空間?

16樓:匿名使用者

動態一維陣列可以直接用mallco語句,動態二維陣列,可以用calloc動態分配n個記憶體塊

17樓:匿名使用者

malloc

或者new

C指標變數與變數指標的區別,指標和指標變數有什麼區別呢?

用例子來看一下。int a 3 int p p a 現在來看一下。a 3這個式子先解釋一下 等式右邊是常量,左邊是變數。同理的p a,左邊的是指標變數,右邊的是指標 乙個變數占用連續的若干個記憶體位元組時,最前面的乙個位元組的位址就作為該變數的位址。指標就是記憶體位址,是變數的位址,或函式的入口位址...

通過形參指標變數改變實參指標變數

swap函式修改成 void swap int p1,int p2 補充 swap pointer 1,pointer 2 時編譯器重新生成了2個臨時變數 swap pointer 1,pointer 2 其中,pointer 1 pointer 1,pointer 2 pointer 2 你要交換...

c語言程式設計 指標變數賦值,C語言程式設計 指標變數賦值

要將指標指向的值賦值到變數上,需要將指標指向的值取出,然後執行賦值操作。對指標取值需要使用取值運算子 這個符號和乘相同,但功能不同。用於取值時,為單目運算,與後續的指標相結合,實現取指標指向的值的效果。比如int a 10 int b int p a 這時p指向變數a的位址,指向的值為10,要將其賦...

變數的指標和指標變數概念分別是什麼

指標可以了解為是指存放變數的位址,你想要找到這個變數可以通過找到它存放的位址 即它放在哪 來尋找 變數是變化的量,沒有固定的值,可以根據自己的需要來賦值,比如可以賦為1或2等等,這樣變數的指標和指標變數就不難理解了。希望能對你有幫助。乙個變數的位址稱為該變數的 指標 通俗的但不科學的講就是變數的位址...

關於指標變數的初始化。。指標變數怎麼初始化

有這種寫法,但是如果你試圖修改p指向的內容就會有問題了,如果只是輸出的話沒問題。這是正確的 char 指標的初始化。也可以寫成 char p string 這是把儲存 string 的首位址賦值給 p 指標變數怎麼初始化 可以指向空,也可以指向某個變數位址啊。定義時 int p null 或者int...