c 中使用new動態分配儲存空間

2021-07-09 12:08:26 字數 1370 閱讀 7126

下面這個例子,檢驗new給double型陣列分配的儲存空間的首位址是多少。s是指向這個陣列的指標,s+1即是指標移動一位,指向下乙個元素。

[ root@sparkmaster test]# cat newarray.cpp

#include int main()

{ double * s;

int i;

s = new double[10]; //分配一片儲存空間給s,s指向這片空間的首位址。這片空間將要存的是10個double型數值

std::cout<<"before giving value,s is "<

執行結果如下:

[ root@sparkmaster test]# g++ -o newarray newarray.cpp

[root@sparkmaster test]# ./newarray

before giving value,s is 0x17aa010,*s is 0

after giving value:

&s[0]=0x17aa010

s[0]=100

&s[1]=0x17aa018

s[1]=101

&s[2]=0x17aa020

s[2]=102

&s[3]=0x17aa028

s[3]=103

&s[4]=0x17aa030

s[4]=104

&s[5]=0x17aa038

s[5]=105

&s[6]=0x17aa040

s[6]=106

&s[7]=0x17aa048

s[7]=107

&s[8]=0x17aa050

s[8]=108

&s[9]=0x17aa058

s[9]=109

s is 0x17aa010

s+1 is:0x17aa018

s+2 is:0x17aa020

s+3 is:0x17aa028

s+4 is:0x17aa030

s+5 is:0x17aa038

s+6 is:0x17aa040

s+7 is:0x17aa048

s+8 is:0x17aa050

s+9 is:0x17aa058

可見,陣列的元素位址跟指標是一一對應的,s[0]的位址即是s指標的記憶體,s[1]的位址即是s+1指標的內容。那為什麼s+1,位址卻不是加1,實際是8(0x17aa020-0x17aa018=0x8)?哦對了,因為double型別的單位長度是8 byte!

另外,此例也驗證了,如果s是指向陣列的指標,s[i]即是陣列中第i個元素的值,而不是*s[i],實際上*s[i]是個非法表示。若要表示s[i]元素的位址,應該是&s[i].

儲存空間動態分配

ansi c說明了三個用於儲存空間動態分配的函式 1 malloc 分配指定位元組數的儲存區。此儲存區中的初始值不確定 2 calloc 為指定長度的物件,分配能容納其指定個數的儲存空間。該空間中的每一位 bit 都初始化為0 3 realloc 更改以前分配區的長度 增加或減少 當增加長度時,可能...

C 之儲存空間的動態分配和釋放

很多時候,我們需要根據問題的實際規模來定義陣列的大小,即確定實際需要使用的儲存空間的大小,這個時候就要用到動態申請 釋放儲存空間的方法。一般情況下,變數儲存空間的分配和釋放是由系統自動完成的,不需要我們的干預。系統對自動分配記憶體的變數的訪問方式有兩種 在程式執行中動態申請 釋放記憶體的變數,只能通...

C 擴充動態分配陣列的儲存空間

這裡直接示例 include include using namespace std intmain int argc,char ar 開闢一段更大的記憶體 int pointer newint 10 將原始記憶體的資料 拷貝到新的記憶體裡 memcpy pointer,p,sizeof int 5...