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’ 留一個空間。 為字串分配空間,至少,要多分配一個字元的空間。 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 申請陣列空... 首先你可以進行單步測試自己看看能不能學習到過程 程式設計師以後寫程式排錯 要學會自己單步測試找問題 過程很簡單 你定義了一個1維陣列 陣列長度為10 從a 0 a 9 進行for迴圈計算 i 9 a 9 10 9 1 同理 a8 2 a5 5 a2 8 所以輸出 a2,a5,a8 分別就是852 希... 陣列名可以當做指標使用,但這種指標沒有實際佔用記憶體空間 不存在存放首地址什麼的 因為你只能對該類指標 陣列名 指向的資料操作!沒有你想的那種多佔一個空間存放地址的意思,陣列名不是完整意義的指標 空間的位置看你的陣列在程式中定義的位置,有可能是棧,也可能是堆,也可能是全域性資料域。array可以當做...C語言程式設計問題(用一維陣列),C語言程式設計問題(用一維陣列)
關於c語言陣列的運算,關於C語言陣列的運算。
有關c語言陣列的宣告,建立,c語言陣列宣告問題