先看例子:
為乙個二級整形指標分配乙份可儲存 3*3 矩陣的記憶體。
在使用 p[i][j] 呼叫記憶體時,編譯器會顯示「取消對null指標p[i]的呼叫」#include
#include
intmain()
顯然,這個方式有問題。
在這個例子中,物件為int型別,記憶體為 int 型別的數量分配,強制轉化型別為 int**
看似很對,但實際上,int** 型別為二級指標,其資料的本質是乙個存放指標的位址量,
而在malloc函式中,記憶體是以 int 型別為目標進行分配的,這就導致了,本應該作為int的記憶體,被當作是int**型別。
又因為,在vs2019中,int** 與int 都為四位元組,所以,p實際上得到的是連續9個的二級整形指標,
可以看作是
p == int[9](型別表示式);
在看到一般情況下的動態分配:
對於指標本身,如果不取位址,那麼使用賦值運算,改變的始終是指標指向的物件,int
*p;p=
(int*)
malloc
(sizeof
(int)*
3);
而指標自己所佔據的位置並沒有發生任何改變。
又有,指標指向某個物件的方法就是將物件所佔據的記憶體的位址碼儲存到自己所佔據的空間中。
而且 malloc() 函式的返回值為所分配的記憶體空間的首位址。
所以,在這個動態記憶體分配的語句中,被分配的記憶體的型別與強制轉換的型別相比,要低乙個級別。
另外,在說一下,關於 * 與 的優先順序問題。int i =0;
*p =
(int**
)malloc
(sizeof
(int*)
*3);
if(*p ==
null
)for
(i =
0;i <
3;i++
)}
> * ;
所以,
int**
*p;int a[3]
[3];
*p=a;
*p[1][
1]等於*
(p[1])
[1]應該用(
*p)[1]
[1];
指標 動態記憶體分配
c 中的動態記憶體分配機制 c 中使用new和delete來完成在堆上對動態記憶體的分配和釋放。注.所有指標都應該被初始化 如果指標指向的動態記憶體被釋放或沒有指向合法的位址,就應該將指標設定為nullptr,否則記憶體洩漏 變數 double pvalue pvalue new double pv...
指標 堆記憶體分配(動態記憶體)
一 對於普通陣列來說,在定義或初始化時必須確定元素個數,即下標必須是已知的,即在編譯時已知。例 定義陣列時 int a 6 初始化陣列時,float a 對陣列a來說,雖然沒有下標,但是通過 中的元素個數,可以查出其下標為4。像這樣的格式 int a 錯誤,下標未知 int a n 錯誤,同上 in...
指標 3(動態記憶體分配)
動態記憶體分配 重點 傳統陣列的缺點 1.陣列長度必須事先制定,且只能是常數,不能是變數 例 int a 5 ok int len 5 int a len error 2.傳統形式定義的陣列,該陣列的記憶體程式設計師無法手動釋放 在乙個函式執行期間,系統為該函式中陣列所分配的空間會一直存在,直到該函...