C語言中的記憶體地址



C語言中的記憶體地址

在C語言中宣告變數時,會為其分配一個記憶體地址C編譯器將變數的值儲存在記憶體的不同段中。

記憶體段

C程式的不同元素儲存在計算機記憶體的不同段中,這些段包括:

  • 程式碼段 − 程式碼段,也稱為程式碼段或簡稱為文字,是程式的一個部分,用於儲存C程式的目標版本。
  • 已初始化資料段 − 程式設計師初始化的全域性變數靜態變數在已初始化資料段中分配記憶體。
  • 未初始化資料段 − 未初始化資料段也稱為bss(代表block started by symbol)。程式載入時會為此段分配記憶體。在C程式執行之前,核心會將bss中的所有資料初始化為算術“0”,並將指標初始化為空指標。
  • − 棧是一種LIFO(後進先出)資料結構。棧段儲存區域性變數的值和傳遞給函式的引數的值。它還維護函式呼叫返回的指標。
  • − 堆用於在執行時分配記憶體。所有執行動態記憶體分配的函式都與堆相關。

訪問記憶體地址

可以透過取地址(&)運算子訪問或指定C語言中的記憶體地址。要使用printf()函式列印記憶體地址,需要使用%p格式說明符。

語法

以下是訪問記憶體地址的語法:

&variable_name

示例

在下面的示例中,我們宣告兩個變數並列印它們的記憶體地址:

#include <stdio.h>

int main() {
   // Declaring two variables
   int a;
   int b;

   // Accessing their memory
   // addresses and print them
   printf("Memory address of a is %p\n", &a);
   printf("Memory address of b is %p\n", &b);

   return 0;
}

C編譯器如何分配記憶體?

記憶體可以被認為是一個位元組陣列,每個地址都是陣列中的一個索引,並儲存1個位元組。

在C程式中宣告變數時,C編譯器會根據大小需求(取決於型別)為其分配一個隨機記憶體位置。

宣告一個int變數時:

int x = 10;

編譯器會在隨機位元組地址中賦值。由於int型別需要4個位元組,因此會為此預留接下來的四個地址。

C允許您找出已為變數分配了哪個地址。您可以使用%p格式說明符來列印記憶體位置的十六進位制地址。

char x = 'A';
printf ("address of x: %p\n", &x);

這將列印“x”的十六進位制地址:

Address of x: 000000000061FE1F

示例

C語言中的陣列是連續的記憶體區域,用於儲存相同資料型別(int、long、*char等)的多個值。

#include <stdio.h>

int main() {

   // initialize an array of ints
   int numbers[5] = {1,2,3,4,5};
   int i = 0;

   // print the address of the array variable
   printf("numbers = %p\n", numbers);

   // print addresses of each array index
   do {
      printf("numbers[%u] = %p\n", i, (void *)(&numbers[i]));
      i++;
   } while(i < 5);


   // print the size of the array
   printf("sizeof(numbers) = %lu\n", sizeof(numbers));
}

輸出

執行此程式碼時,將產生以下輸出:

numbers = 0x7fff0815c0e0
numbers[0] = 0x7fff0815c0e0
numbers[1] = 0x7fff0815c0e4
numbers[2] = 0x7fff0815c0e8
numbers[3] = 0x7fff0815c0ec
numbers[4] = 0x7fff0815c0f0
sizeof(numbers) = 20
廣告