我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入分析C语言存储类型与用户空间内部分布

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入分析C语言存储类型与用户空间内部分布

1、定义变量的格式

存储类型 数据类型 变量名 = 初始值;

2、6个存储类型

自动存储区:auto register

非自动存储区:const static extern volatile

3、auto存储类型-自动存储类型

自动类型:局部变量属于自动类型,定义局部变量时,加auto或者不加auto都是一样的,一般省略auto.

非自动类型:全局变量,使用static修饰的全局变量或者局部变量不可以使用auto进行修饰。

#include <stdio.h>
int s;  // 全局变量,属于非自动类型,不可以使用auto修饰
// auto int k;  // error
static int x; // 使用static修饰的静态全局变量,属于非自动类型,不可以使用auto修饰
// auto static int x;   // error
int main(int argc, const char *argv[])
{
    
    int i;   // 自动类型变量,省略auto
    auto int j;  // 自动类型变量,使用auto修饰
    static int m;  //  使用static修饰的静态局部变量,属于非自动类型,不可以使用auto修饰
    // auto static int n;  // error
    return 0;
}

4、register存储类型-寄存器存储类型

定义寄存器存储类型的变量,定义的变量分配一个寄存器的空间给变量使用。

尽量不要定义寄存器类型的变量,在CPU中寄存器的数量有限(空间有限)

寄存器变量不可以进行去地址取运算(&),原因是寄存器没有地址。

5、const存储类型-常量存储类型

1.只读,初始化后不能修改;

2.使代码更紧凑;

3.编译器自然保护不希望改变的参数,防止无意修改代码

(例:const int * p=&a ,表示*p不能改变a的值

​ int const * p=&a ,表示*p不能改变a的值

​ int * const p=&a ,表示p指向的地址不能改变

​ const int * const p=&a ,表示既不能改变指向的地址,又不能改变指向地址中的值)

6、static-静态存储类型

1.static修饰局部变量:延长生命周期到整个进程结束,

​ 只在第一次调用此函数时,对静态局部变量进行初始化,后面在此调用函数,不在初始化

​ 如果定义的静态局部变量没有进行初始化,默认初始化为0

2.static修饰全局变量:外部文件不可以使用,静态全局变量的作用域在本文件内。

3.static修饰函数:外部文件不可以使用,静态全局变量的作用域在本文件内。

7、extern-修饰全局变量

1.externa修饰全局变量,表示这个全局变量在其他文件中定义的

2.externa修饰函数,表示这个函数是在其他文件中定义的

3.声明一个变量,extern声明的变量没有建立存储空间。int a;//变量在定义的时候创建存储空间

8、volatile-易变存储类型

volatile关键字用来阻止编译器认为的无法“被代码本身”改变的代码进行优化。

如在C语言中,volatile关键字可以用来提醒编译器它后面所定义的变量随时有可能改变,

因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。

如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,

如果这个变量由别的程序更新了的话,将出现不一致的现象。

在java并发编程中,volatile的作用

对于可见性,java提供了volatile关键字来保证可见性。

当一个共享的变量被volatile修饰时,它会保证修改的值会立即被更新到主存当中,当其他线程需要读取时,

它会去内存中读取新值。

9、用户空间内部分布图

代码解析:

#include <stdio.h>
int d; // 全局变量未初始化 值为0 .bss
int e=10; //全局变量初始化 .data
char *p = "hello"; //字符指针 p在.data "hello"在.rodata
char arr[] = "world"; //.字符数组 .data
static int f; //使用static修饰的未初始化的全局变量 值为0 .bss
static int g=20; //使用static修饰的初始化的全局变量 .data
int main(int argc, const char *argv[])
{
     int a=10; //局部变量初始化 栈区
     int b; //局部变量未初始化,随机值 栈区
     static int c; //使用static修饰的局部变量 未初始化 值为0 .bss
     static int d=20; //使用static修饰的局部变量初始化  .data
     char *p = "hello"; //字符指针 p:在栈区 “hello”在 .rodata
     char arr[] = "world"; //字符数组 栈
     char *q = malloc(10); //q在栈区,指向堆区的10字节的⾸地址
     return 0;
}

到此这篇关于深入分析C语言存储类型与用户空间内部分布的文章就介绍到这了,更多相关C语言存储类型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入分析C语言存储类型与用户空间内部分布

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入分析C语言存储类型与用户空间内部分布

这篇文章主要介绍了C语言存储类型与用户空间内部分布,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2022-12-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录