c語言用malloc申請完陣列後,怎樣再檢視申請陣列的大小

2022-03-09 22:50:12 字數 6321 閱讀 6546

1樓:匿名使用者

c語言本身不提供檢視動態分配的記憶體大小,因為分配記憶體是系統的api函式完成的。

但是通過呼叫系統的api函式可以檢視記憶體分配大小,不然肯定無法釋放這些記憶體了。

以windows為例:

#include

using namespace std;

int main()

{int *p=(int *)malloc(sizeof(int)*10);

cout<

2樓:匿名使用者

沒法看,分配記憶體是系統的api函式完成的,除非分配時記住了大小,否則你找不到記錄大小的位置,雖然記錄這個大小的資料一定存在。

3樓:匿名使用者

1、一般是獲取不到的,不過這個也得看編譯器是如何實現的。vc++在每次分配的動態陣列的起始地址之前記錄動態陣列的大小,這樣就可以得到記憶體空間大小。

2、例如:

int *a=new int[12];

cout<<"動態陣列佔用記憶體大小:"<<*(a-4)<

cout<<"動態陣列中元素個數:"<<*(a-4)/sizeof(a)<

int *b;

b=(int*)malloc(sizeof(int)*12);

cout<<*(b-4)/sizeof(b)<

b=(int*)realloc(b,sizeof(int)*16);

cout<<*(b-4)/sizeof(b)<

4樓:匿名使用者

只能根據呼叫malloc時候的引數……

5樓:投機士

這個涉及兩個儲存區域,堆和棧,你用malloc申請的空間在堆上,char a[10]這個是在棧上。

堆和棧最重要一個區別是,棧是系統管理的的,他負責**和釋放,所以有個概念叫作用域,變數的作用域一結束,棧就**變數的資源。但是堆是程式設計師管理的,你不釋放,除非程序結束,這個空間就一直在那,就有了一定靈活性。

回答了申請堆的作用。

堆在實現的時候確實是在底層是連結串列的形式沒錯,棧是連續的空間。

6樓:金色潛鳥

#include

main()

在c語言中如何使用malloc動態申請一維陣列?

7樓:海天盛

malloc()函式用來動態地分配記憶體空間,其原型為:void*malloc(size_tsize);

描述:(引數描述)

size是以位元組為單位分配的記憶體空間量。

【功能描述】

malloc()在堆中分配指定大小的記憶體空間來儲存資料。函式執行後,此記憶體空間未初始化,且其值未知。如果希望在分配記憶體的同時進行初始化,可以使用calloc()函式。

(返回值)

分配成功時返回指向記憶體的地址,失敗時返回null。

操作:由於在請求記憶體空間時,可能有記憶體空間,也可能沒有記憶體空間,所以在繼續之前,您需要自己決定應用程式是否成功。

如果size的值為0,返回值可能為null,也可能不為null,這取決於標準庫實現,但是不應該再次引用返回的指標。

注意:函式的返回值型別為void*,void並不意味著沒有返回值或空指標,而是返回的指標型別未知。所以當你使用malloc()時,你通常需要將void指標轉換成你想要的型別,例如:

# include < stdlib。h >

typedefintlistdata;

listdata*資料;//儲存空間的基本地址

data=(listdata*)malloc(100*sizeof(listdata));

擴充套件資料:

實現malloc的方法:

(1)資料結構

首先,我們要確保資料結構。一個簡單可行的解決方案是將堆記憶體空間組織成塊,每個塊由一個元區域和一個資料區域組成,元區域記錄關於資料塊的後設資料(資料區域大小、空閒標誌位、指標等)。

資料區域是實際分配的記憶體區域,資料區域的第一個位元組地址是malloc返回的地址。

(2)找到正確的街區

現在考慮如何在區塊鏈中找到合適的區塊。一般來說,有兩種搜尋演算法:

firstfit:從頭開始,使用第一個大於所需大小的資料塊稱為已分配的塊

最佳匹配:從頭開始遍歷所有塊,使用資料區域大小大於大小且分配的塊的差異最小的塊

最適合的有一個高的有效載荷和第一個適合有一個高的操作效率。這裡我們使用第一個fit演算法。

(3)建立一個新的塊如果現有的塊都不能滿足size的要求,則需要在列表的末尾建立一個新的塊。

(4)分塊先拼裝有一個致命的缺點,那就是它可能允許較小的尺寸佔據一個較大的塊。在這種情況下,為了改進有效負載,當剩餘的資料區域足夠大時,應該將其劃分為一個新的塊。

(5)malloc的實現

通過上面的**,我們可以實現一個簡單的malloc。注意,首先我們需要定義連結串列的第一個塊,first_block,初始化為null;此外,我們需要至少剩下的空間block_size+8來執行除法操作

因為我們需要malloc分配資料區域在8位元組處對齊,所以大小不適用於8個倍數,所以我們需要調整大小,使其大於8的最小倍數的大小。

8樓:匿名使用者

char *array = null;

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

或int *array = null;

array = (int *)malloc(10*sizeof(int));

使用*(array+2); 或array[2]

9樓:主頁

int num;

scanf("%d",&num);

int a[num] = (int *)malloc(sizeof(int)*num);

c語言,請問下如果定義一個陣列,用malloc分配空間,那麼再用sizeof計算陣列名,大小是什麼

10樓:匿名使用者

你的理解是對的。

用malloc分配的空間是分配在堆中,malloc的返回值只是這個空間的首地址,一般我們會將它儲存到一個指標變數中,以便以後使用。而任何型別的指標變數的size都是固定的(現在一般為4個位元組),所以sizeof(指標變數)的結果是4,計算出來的並不是分配的空間的位元組數。

c語言裡面怎麼給一個用malloc申請了動態空間的陣列賦值

11樓:席承悅士玉

比如說int

p;p=(int

*)malloc(sizeof(int)*n);

那麼p就相當於陣列p[n]的基地址了,所以對它賦值只要用陣列的寫法:

p[i]=x;

就可以了

c語言,怎麼用malloc申請一個100000個變數的字串陣列?

12樓:匿名使用者

這是一個二維陣列,所以要定義一個二維指標才能完成相應的操作

char **m ;

m = (char**)malloc(sizeof(char *) * 100000); //行數

int i=0;

for( i=0;i<100000 ;i++ )接下來,就和使用二維陣列一樣的操作m了,如:

strcpy( m[0], "hello" );

m[0][0]= 'h' ;

13樓:匿名使用者

可以通過以下語句實現:

char *p; //定義指標變數

p = (char *)malloc(100000);//申請空間並賦值給p。

解析:malloc為記憶體分配函式,其定義為void * malloc(size_t size);

功能為申請size大小的記憶體長度,並返回分配到的地址值。

而字元型別,每個元素佔1個位元組空間,所以100000個變數的總空間就是100000位元組,於是引數size為100000。

14樓:匿名使用者

#include

#include

#include

using namespace std;

// 申請的arr空間類似: #代表point *代表data; 那麼他就是一個 4行5列的資料

//  #***** #***** #***** #***** //這是本來應該儲存的形態

//  ####***** ***** ***** ***** //這是我們寫出來的結構 那麼解釋一下

// 第一個# 即頭指標arr, 第二個# 他指向了第第二組的頭 即第二行的首元素 第三個#指向了第三行的首元素 第四個#同理

// head即第一個*的位置

//  二維陣列 arr[i][j] 等價於 * ( arr + i ) + j; 又等價於 arr[i] + j; ( 此處arr[i]代表地址 )

template < typename type >

type ** new_array_2d( int row, int col )         //row是行 col是列

// this指標即為date -> func() 等價於 func( &date ), 隱含傳遞了this;

}           // 現在arr[i][j] 的地址即為這個資料的指標

}return ( type ** ) arr;               //返回這個陣列頭指標

}template < typename type >

void delete_array_2d( type ** arr, int row, int col )      //釋放二維陣列 row行 col列

}if( arr != null )

}int main()

}for( int i = 0; i < nrow; i++ )             //輸出二維陣列

cout << endl;

}delete_array_2d< string >( p, nrow, ncol );        //釋放記憶體

system( "pause" );

return 0;

}你申請的是一維的 你想要的是二維的 當然報錯

15樓:修和玉於旋

這是以前我寫的**,字串存在buffer指標所在的緩衝區中intreadbuffer(char

**buffer)

free(buftemp);//釋放

buffer[buf_totalcount-1]='\0';

//填充結束符

returnbuf_totalcount-1;//返回實際字串的長度

}希望對你有幫助

c語言用malloc定義動態字元陣列,發現字元陣列長度與定義的長度不同

16樓:

記憶體不是樹枝,截斷了就不連在一起了。

分配記憶體,和分地差不多,

分給你一畝地,你種十畝,其實也可以,

不過你用了別人的土地,是要付出代價的。

打架,打官司,乃至被人害了,都是有可能的。

你合法的擁有的可以使用的土地,就只有分給你的那一畝地。

別的都是別人家的。收了別人的莊稼,或者種了別人的地,別人會不高興的。

至於會出什麼狀況,看別人有什麼反應就知道了。

你分配的記憶體沒有初始化,不知道何處會有個‘\0’;strlen(pcwholehead)只有找到‘\0’,才會返回串的長度ntest = strlen(pcwholehead);//測試發現ntest是80,這裡明顯已經出現越界訪問了。

出現這種問題是非常正常的;

要用strlen(pcwholehead)獲取字串的長度,必須確保實參pcwholehead是個字串。

分配的這塊記憶體有多大,這應該有記錄的,但是這個由編譯系統和庫去維護,是封裝了的,是不會告訴你的。

不要徒勞的去做那些,做不到的事情,如果你學的深入了(至少編譯原理要學),可以再去研究這個問題。

先要學會合法做事,然後再研究不合法,會出現什麼問題。

ps:pcwholehead[nendpos] = 0 ;訪問越界了;

應該是pcwholehead[nendpos-1] = 0 ;

這樣,ntest = strlen(pcwholehead);應該<=61 ;別指望一定會得到61;當然不會是62,因為要為‘\0’ 留一個空間。

為字串分配空間,至少,要多分配一個字元的空間。

C語言程式設計問題(用一維陣列),C語言程式設計問題(用一維陣列)

include void main int i,j,n,k,x,a 100 scanf d d n,x k n for i 0 i include include int main int i,j,n,x,a scanf d d n,x a int calloc n,sizeof int 申請陣列空...

關於c語言陣列的運算,關於C語言陣列的運算。

首先你可以進行單步測試自己看看能不能學習到過程 程式設計師以後寫程式排錯 要學會自己單步測試找問題 過程很簡單 你定義了一個1維陣列 陣列長度為10 從a 0 a 9 進行for迴圈計算 i 9 a 9 10 9 1 同理 a8 2 a5 5 a2 8 所以輸出 a2,a5,a8 分別就是852 希...

有關c語言陣列的宣告,建立,c語言陣列宣告問題

陣列名可以當做指標使用,但這種指標沒有實際佔用記憶體空間 不存在存放首地址什麼的 因為你只能對該類指標 陣列名 指向的資料操作!沒有你想的那種多佔一個空間存放地址的意思,陣列名不是完整意義的指標 空間的位置看你的陣列在程式中定義的位置,有可能是棧,也可能是堆,也可能是全域性資料域。array可以當做...