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』 留乙個空間。 為字串分配空間,至少,要多分配乙個字元的空間。 陣列有分動態陣列和靜態陣列 動態陣列,是指數組的元素個數,不是宣告的時候就定下來,比如int a new int i 這裡的i也是變數,有可能為1,也可能為10。靜態陣列,是指宣告的時候,元素的個數就確定下來了,比如int a 10 c語言中都是靜態陣列,c 中才有動態陣列的概念。樓主所說的並不是我... 一般有四種陣列定義方式,以一維陣列為例 定義指定維數的陣列int arr 10 定義不指定維數的陣列,陣列維數有初化列表元素個數決定。int arr 定義指定維數的陣列,初始化不完全時,系統將未初始化元素初始化為0int arr 10 動態分配乙個陣列。陣列例項 include int main v... 是陣列,陣列你可以這麼定義int a 10 也可以這麼定義int a,後面就可以用a 1 了 你這個程式中mem devp應該是乙個mem dev型別的指標,總共分配了memdev nr devs個,第一種定義方式 mem dev mem devp memdev nr devs 這是靜態分配記憶體 ...C中陣列疑惑,C語言陣列問題
簡單的C語言陣列程式設計,c語言陣列的程式設計
簡單的C語言,關於malloc。有圖