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
广告