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

2022-02-11 13:15:05 字數 5842 閱讀 4682

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申請乙個100000個變數的字串陣列?

10樓:匿名使用者

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

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' ;

11樓:匿名使用者

可以通過以下語句實現:

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

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

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

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

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

12樓:匿名使用者

#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;

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

13樓:修和玉於旋

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

**buffer)

free(buftemp);//釋放

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

//填充結束符

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

}希望對你有幫助

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

14樓:

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

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

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

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

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

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

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

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

你分配的記憶體沒有初始化,不知道何處會有個『\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語言陣列問題

陣列有分動態陣列和靜態陣列 動態陣列,是指數組的元素個數,不是宣告的時候就定下來,比如int a new int i 這裡的i也是變數,有可能為1,也可能為10。靜態陣列,是指宣告的時候,元素的個數就確定下來了,比如int a 10 c語言中都是靜態陣列,c 中才有動態陣列的概念。樓主所說的並不是我...

簡單的C語言陣列程式設計,c語言陣列的程式設計

一般有四種陣列定義方式,以一維陣列為例 定義指定維數的陣列int arr 10 定義不指定維數的陣列,陣列維數有初化列表元素個數決定。int arr 定義指定維數的陣列,初始化不完全時,系統將未初始化元素初始化為0int arr 10 動態分配乙個陣列。陣列例項 include int main v...

簡單的C語言,關於malloc。有圖

是陣列,陣列你可以這麼定義int a 10 也可以這麼定義int a,後面就可以用a 1 了 你這個程式中mem devp應該是乙個mem dev型別的指標,總共分配了memdev nr devs個,第一種定義方式 mem dev mem devp memdev nr devs 這是靜態分配記憶體 ...