指標初始化前後分配的記憶體相同嗎,怎麼給指標陣列分配記憶體和初始化

2022-06-30 23:10:16 字數 6241 閱讀 2035

1樓:

3全部發兩張除錯圖(我加了個指標變數c為了更透徹),樓主一看便知:

1。b被賦值之前。可以看到&b和&c是有值的,分別為:

0x0012ff74、0x0012ff70說明分配記憶體了。而b和c 的值都很顯眼的為0xcccccccc這並非我們想當然的認為是隨機值,這應該是vc編譯器所做的處理,不同編譯器值應該不一定相同。

2。b被賦值之後:b的值發生改變,變為a的地址。

而&b,&c的值都沒有發生改變,說明並沒有重新分配記憶體。這裡對b賦值我覺得不應該叫初始化,因為之前int*b;的時候編譯器已經初始化了b,只不過不是按使用者的指定值,因為使用者壓根沒提供初始值。

2樓:匿名使用者

int a =10;

int *b ; //此時b是一個野指標,這裡沒有分配記憶體,只是定義了一個指標而已。

b = &a; //此時b初始化,這裡只是初始化指標,將其指向了有效地址(a的地址),沒有分配記憶體。

要分配記憶體的話,如下:

int *b = (int)malloc(4);

3樓:匿名使用者

指標也不過只是記錄一個記憶體地址而已,本身不會有任何問題,但是一旦你通過他來訪問指向的記憶體塊的時候,就需要注意了地址的合法性,野指標的地址值 是一個不可預知的地址,其實指標就好比**號碼一樣,野指標就好比一個錯誤的**號碼,你打這個**號碼有可能會有人接,也可能沒有,這完全取決於作業系統的實現。

4樓:

指標也是變數,任何變數在定義時,就已經分配了地址,是不變的,固定的。一個變數給它分配內在只有一次,就是定義時。

5樓:

嗯嗯,樓主說的完全正確

怎麼給指標陣列分配記憶體和初始化

6樓:風若遠去何人留

指標陣列, 每個指標要單獨分配記憶體,不過 如果各個指標上分配長度不相等,那麼需要自行記住每個指標上記憶體的大小, 避免越界。

可以使用迴圈進行分配及初始化。

以定義一個5個元素的int*陣列, 每個上分配10個int型空間,並初始化為0為例

int *a[5];

int i,j;

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

string型指標如何使用?必須初始化分配空間記憶體麼?求大神解答下面**執行的原理。不需要改正**~

7樓:德克and德華

你思考一下如下**:

int a = 1;

int *p;

*p = a;

你的**的問題和這個同理。

p根本就沒有初始化,根本無法知道它指向**,然後你居然要企圖修改它所指向的那個地方的記憶體。

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

8樓:匿名使用者

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;

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

9樓:匿名使用者

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

10樓:夔澄

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

11樓:

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

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

12樓:

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

你可以這樣

#include

#include

#include

void main()

else

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

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

0xcccccccc(十六進位制)

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

1,動態分配記憶體

2,為指標變數賦值

c++對一個指標分配記憶體

13樓:東方迪

可以的,相當於第一行申明瞭一個指標變數(未初始化);

第二行,給指標分配一個記憶體;

效果等同於 char *p=new char;

除了new,棧上的臨時變數也能賦值給指標,例如char c;

char*p = &c;

結構體指標陣列賦值前必須分配記憶體嗎?

14樓:匿名使用者

ps[i] = p; //調單步時發現不能賦值(前面漏了)p是否已指向一個結構?沒有的話調成員會出現空指標錯誤結構體指標陣列賦值前不必分配記憶體,但用指標前必須確保它指向正確。

你只貼了一點點**,如果有可能,全貼出來讓我們看看。

你不能賦值的問題有點奇怪,如果是你一個檔案裡**太多,有可能是編譯器單步不同步,你還是找找程式中其他錯誤,別局限在這裡,你可以寫個小程式試試,結構體指標陣列賦值前不必分配記憶體的

15樓:小八

任何指標在使用前都必須初始化

指標在定義的時候就分配了記憶體 大小是 unsing int 4個位元組

c語言如何確定一個指標是否已分配過的記憶體

16樓:匿名使用者

如果malloc()分配失敗,就會返回null,如果成功,那麼返回的就是這段空間的首地址,而不會是null,可以據此判斷malloc()分配是否成功。

17樓:匿名使用者

判斷是否已分配記憶體可以測試指標是否為空,不為空則為已分配,具體可以使用sizeof函式。

1、假設使用c語言的動態分配記憶體函式malloc為指標p分配1000個int型的空間

int* p;

p = (int *) malloc (1000*sizeof(int)); //分配記憶體

if (!p)

printf("記憶體已分配");

18樓:

沒得辦法,只能靠自己注意了,使用null來判斷,自己養成良好的習慣以後這應該不是什麼問題。

初始化的時候要, char *s = null;

記憶體釋放完以後也要, free(s); s = null;

c語言如何給指標分配記憶體?

19樓:匿名使用者

用malloc函式

如char *a

a=(char)malloc(10*(char));(我記得好像這些寫,很久沒寫過,不過很多資料結構的書都會有這樣一句)

用完記得free!

20樓:匿名使用者

char **a=new char*[10]; //a指向char指標資料

for(int i=0;i<10;i++)//為a陣列中的每個元素分配記憶體,並初始化

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

21樓:

這是簡單的問題,回答卻是亂七八糟。

首先指出,new 是 c++ 的東西,不是 c語言。

c語言 **a 實際上 分配成一個 2 維陣列 a[nr][nc]。

char **a;

int j,nr,nc;

// nr = 多少行,nc = 多少列nr = 10;

nc = 8; // 假定 8

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

for (j=0;j

如果是 int,或float,double ,你把上面的char 換成 int,或float,double 就可以了。

22樓:

#include

#include

void main ()

delete &p[0][0];

char **m;

m=new char*[20]; //給指標分配20個指標(char*)記憶體

printf("%x\n",m);

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

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

delete m;}

23樓:匿名使用者

指標怎麼能分配記憶體?

指標裡面存的是地址.

申請10個指標 char *a[10];

申請一片記憶體,讓指標 指向這片記憶體.

char b[5]=;

a[0]=b;

24樓:

簡單的回答樓主問題:

char **a=(char**)malloc(sizeof(char*)*10);//分配10個指標型別地址給a

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

25樓:匿名使用者

看了下,基本上回答的都是用new

那個,都是c++程式設計師吧

c語言裡面是用malloc的

寫了個簡單程式,看看是不是樓主需要的

#include

#include

#include

int main()

strcpy(pc1, "haha");

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

if( pc2==null )

strcpy(pc2, "heihei");

pv[0]=pc1;

pv[1]=pc2;

pp=pv;

printf("prit pv[0] head char is [%c]\n", pp[0][0]);

printf("prit pv[0] is [%s]\n", pp[0]);

printf("prit pv[1] head char is [%c]\n", pp[1][0]);

printf("prit pv[1] is [%s]\n", pp[1]);

free(pc1);

free(pc2);

e:return r;

}hp環境下cc編譯後輸出:

prit pv[0] head char is [h]

prit pv[0] is [haha]

prit pv[1] head char is [h]

prit pv[1] is [heihei]

matlab如何初始化400列的空陣列?謝謝啦哈

x zeros 1,400 全是零 ones 全是一 類推random 可以做出一個全隨即 0 1 a ones 0,400 a empty matrix 0 by 400 如何初始化一個指標陣列 int a 5 int pt 5 for i 0 i 5 i 以上為一個小例子,指標陣列不可以直接賦值...

我的電腦應用程式正常初始化(OxcOOOOOba)失敗是怎麼回事

上述情況的原因是system32中缺少了msvcirt.dll檔案或者給同名資料夾代替了 病毒 去上網補下個檔案拷進c windows system32 中即可。如果不能解決就去重灌系統吧。值得一提的是msvcirt.dll有的機子不可以釋放在新建的資料夾。下下來的zip 或者rar檔案直接釋放在c...

微控制器初始化的一般步驟,51微控制器串列埠初始化步驟,首先初始化那個在初始化那個,最好是華為等大公司的初始化模版

一般分來四個步源驟 1 將相應的引腳配置bai 成uart模式 du2 配置和使能uart,包括zhi配置波特率,是否使dao用fif0,資料幀格式 資料長度,停止位,奇偶校驗,收發資料緩衝區大小等 3 配置中斷 一般分3大類,共7種 4 讀寫資料 你可以參考at162微控制器的datasheet來...