[英]Dynamic memory allocation using malloc() in C program
我在 C 程序中有以下語句,其中 *size 是字節數。 它是 *size 的原因是,size 是 Fortran 77 代碼中 C function 的參數。 Fortran 將 memory 地址的大小發送給 C 程序,*size 是它保存的值,即字節數(*size = 1138208)
ptr = malloc(*size)
printf("ptr= %ld,", ptr);
打印輸出為 ptr 提供了一個數字
指針 = 46912496308240
這個數字代表什么?
如果您將變量ptr
解釋為 integer,則打印輸出會告訴您變量 ptr 的值。
%ld
告訴printf()
function 將該值打印為“長小數”。 'long' 部分在那里是因為 ptr 的值為 8 個字節(因為它的類型為void *
),而正常的%d
十進制選項是 4 個字節。 “十進制”部分意味着 output 將以 10 為底(書寫數字的標准方式)。
打印出來的值就是ptr
所指向的memory中的地址。 malloc
function 在 memory 中創建了一堆你可以使用的空間, ptr
告訴你它在哪里。
指針的值表示 memory 中的地址。 每個 C 實現都可以自行決定指針如何表示地址,但在現代 C 實現中很常見,地址空間的字節有效地用從零開始的連續整數編號,表示指針的位是二進制地址. 實際上,46,912,496,308,240 的指針“值”表示地址空間中的字節數 46,912,496,308,240 字節。
請注意,這並不意味着您的系統有 46,912,496,308,241 字節的 memory; 並非所有的地址空間都被使用。 一個進程的 memory 的不同部分(例如初始化數據、代碼、堆棧和動態分配的內存)在不同的位置啟動,因此它們有增長空間而不會相互碰撞。 這會留下地址空間未映射到可用 memory 的空白。
您不應該通過使用%ld
對其進行格式化來打印指針。 打印指針的正確方法包括將其轉換為void *
並使用%p
:
printf("ptr = %p\n", (void *) ptr);
或將其轉換為uintptr_t
並使用"%" PRIxPTR
,包括<inttypes.h>
和<stdint.h>
:
printf("ptr = %" PRIxPTR "\n", (uintptr_t) ptr);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.