二. 征服C指针:C如何使用内存

虚拟内存

现代OS都会给应用程序每个进程分配独立的虚拟地址空间。这样做的目的是为了保证安全,防止应用程序破坏内存空间。。这和 C 语言本 身并没有关系,而是操作系统和 CPU 协同工作的结果。即:应用程序面对的是虚拟地址空间。

在这里插入图片描述

作用域

有如下三种:

  1. 全局变量
    在函数外定义的变量,默认就是全局变量。全局变量在任何地方都是可见的。当程序被分割到多个源码文件进行编译时,声明为全局变量的变量也是可以从其他源码文件中引用。

  2. 文件内部的静态变量
    同样是定义在函数外部,一旦有static修饰,就变成了文件内部的静态变量,作用域就仅限定在当前所在的源代码文件中。通过static修饰的变量(包括函数),对于其他源代码是不可见的。

  3. 局部变量
    指在函数中声明的变量。通常在语句块结束的时候释放。

存储期(storage duration)

变量除了作用域的不同,还有存储期的不同。

  1. 静态存储期(static storage duration)
    全局变量,文件内的static变量以及用static修饰的局部变量都是静态存储期,都可以称为静态变量。注意:静态变量的寿命从程序运行时开始,到程序关闭时结束,即静态变量一直存在于内存的同一个地址上。

  2. 自动存储期(auto storage duration)
    没有指定static的局部变量,持有自动存储期。这样的变量称为自动变量,这样的变量是程序进入函数时统一进行内存区域分配的。这个特性使用“栈”来实现。

  3. 通过malloc()动态分配的内存
    它的寿命一直延续到使用free()释放它为止。

print_addr.c示例,演示各种不同作用域,存储期变量的指针地址

/**
 * 演示不同作用域、存储期的变量在内存中的地址分布
 * @author liu
 */

#include <stdio.h>
#include <stdlib.h>
  
// 全局变量
int global_variable;

// 文件内静态变量
static int file_static_variable;

void func1()
{
   
  // 局部变量
  int func1_variable;

  // 局部静态变量
  static int func1_static_variable;

  printf("&func1_variable.. %p\n", &func1_variable);
  printf("&func1_static_variable.. %p\n", &func1_static_variable);

}


void func2()
{
   
  int func2_variable;
  printf("&func2_variable..%p\n", &func2_variable);
}


int main(int argc, char *argv[])
{
   
  int *p;

  // 打印两个函数指针
  printf("&func1..%p\n", func1);
  printf("&func2..%p\n", func2);

  // 打印字符常量指针
  printf("string literal..%p\n", "abc");

  // 打印全局变量指针
  printf("&global_variable..%p\n", &global_variable);

  // 打印文件内静态变量指针
  printf("&file_static_variable...%p\n", &file_static_variable);

  // 执行两个函数,打印局部变量和局部静态变量
  func1();
  func2();

  // 用malloc函数分配内存块
  p = malloc(sizeof(int));
  
  // 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值