簡體   English   中英

在 C 程序中使用 malloc() 動態分配 memory

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM