C语言存储结构总结

在C语言中,数据根据其类型和声明方式被存储在不同的内存区域。以下是各类数据存储位置的详细总结:

内存五大分区

存储区存储内容生命周期特点
代码区(.text)程序代码(机器指令)整个程序运行期只读
常量区(.rodata)字符串常量、const全局变量整个程序运行期只读
全局/静态区(.data/.bss)全局变量、静态变量整个程序运行期初始化的在.data,未初始化的在.bss
堆区(heap)动态分配的内存(malloc等)直到free释放手动管理,空间大
栈区(stack)局部变量、函数参数函数执行期间自动管理,空间有限

各类型数据存储位置

基本数据类型

int global_var;          // .bss段(未初始化)
const int c_global = 10; // .rodata段
static int static_var;   // .bss段(未初始化)void func() {int local_var;       // 栈区
}

指针类型

int *p;                 // 全局指针在全局区void func() {char *str;          // 指针变量在栈区char *s1 = "abc";   // "abc"在常量区char s2[] = "abc";  // 数组内容在栈区int *p = malloc(100); // 指向堆区内存
}

数组类型

int global_arr[10];      // .bss段(未初始化)void func() {char local_arr[20];  // 栈区
}

结构体/联合体

struct Point {int x, y;
};struct Point p1;        // 全局结构体在全局区void func() {struct Point p2;    // 局部结构体在栈区
}

动态分配内存

int *arr = malloc(10*sizeof(int)); // 堆区

字符串常量

char *str = "Hello";    // "Hello"在.rodata段

特殊说明

  1. register变量:请求编译器将变量存储在CPU寄存器中(不保证成功)

    register int i;  // 可能存储在寄存器
    
  2. volatile变量:告诉编译器不要优化,每次从内存读取

    volatile int counter;  // 存储位置不变,但访问方式特殊
    
  3. const变量

    • 全局const:常量区(.rodata)
    • 局部const:栈区(但内容不可修改)
  4. static局部变量:虽然作用域是局部的,但生命周期和存储位置与全局变量相同(全局/静态区)

内存布局示意图

高地址
┌─────────────┐
│   栈区      │ ← 向下增长
├─────────────┤
│     ↓       │
│    (空闲)   │
│     ↑       │
├─────────────┤
│   堆区      │  ← 向上增长
├─────────────┤
│ .bss段      │ (未初始化的全局/静态变量)
├─────────────┤
│ .data段     │ (已初始化的全局/静态变量)
├─────────────┤
│ .rodata段   │ (常量、字符串字面量)
├─────────────┤
│ .text段     │ (程序代码)
└─────────────┘
低地址

验证示例

#include <stdio.h>
#include <stdlib.h>int global_init = 10;      // .data段
int global_uninit;         // .bss段
const int global_const = 5;// .rodata段int main() {static int static_var;           // .bss段int local_var;                   // 栈区char *str_literal = "Hello";     // "Hello"在.rodata段char str_array[] = "World";      // 栈区(数组)int *heap_ptr = malloc(100);     // 堆区printf("全局初始化变量: %p\n", &global_init);printf("全局未初始化变量: %p\n", &global_uninit);printf("全局常量: %p\n", &global_const);printf("静态变量: %p\n", &static_var);printf("局部变量: %p\n", &local_var);printf("字符串字面量: %p\n", str_literal);printf("字符数组: %p\n", str_array);printf("堆内存: %p\n", heap_ptr);free(heap_ptr);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912574.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912574.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912574.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【实战】 容器中Spring boot项目 Graphics2D 画图中文乱码解决方案

场景 架构&#xff1a;spring boot 容器技术&#xff1a;docker 服务器&#xff1a;阿里云 开发环境&#xff1a;windows10 IDEA 一、问题 服务器中出现Graphics2D 画图中文乱码 本地环境运行正常 二、原因 spring boot 容器中没有安装中文字体 三、解决方案 安装字体即可 …

深入浅出:Vue2 数据劫持原理剖析

目录 一、什么是数据劫持&#xff1f; 二、核心 API&#xff1a;Object.defineProperty 三、Vue2 中的数据劫持实现 1. 对象属性的劫持 2. 嵌套对象的处理 3. 数组的特殊处理 四、结合依赖收集的完整流程 五、数据劫持的局限性 六、Vue3 的改进方案 总结 一、什么是数…

数据湖 vs 数据仓库:数据界的“自来水厂”与“瓶装水厂”?

数据湖 vs 数据仓库&#xff1a;数据界的“自来水厂”与“瓶装水厂”&#xff1f; 说起“数据湖”和“数据仓库”&#xff0c;很多刚入行的朋友都会觉得&#xff1a; “听起来好高大上啊&#xff01;但到底有啥区别啊&#xff1f;是湖更大还是仓库更高端&#xff1f;” 我得说…

Node.js-path模块

Path 模块 path 模块提供了 操作路径 的功能&#xff0c;我们将介绍如下几个较为常用的几个 API ​​path.resolve([…paths]) 将路径片段​​解析为绝对路径​​&#xff08;从右向左拼接&#xff0c;遇到绝对路径停止&#xff09; // 若参数为空&#xff0c;返回当前工作目…

Java面试题029:一文深入了解MySQL(1)

欢迎大家关注我的专栏,该专栏会持续更新,从原理角度覆盖Java知识体系的方方面面。 一文吃透JAVA知识体系(面试题)https://blog.csdn.net/wuxinyan123/category_7521898.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=7521898&

vue3.0所采用得Composition Api与Vue2.XOtions Api有什么不同?

Vue 3.0 引入的 Composition API 相较于 Vue 2.x 的 Options API 有显著的不同。下面从几个方面对比这两者的差异&#xff1a; ✅ 1. 代码组织方式不同 Vue 2.x — Options API 使用 data、methods、computed、watch 等分散的选项组织逻辑。 每个功能点分散在不同的选项中&am…

【IP 潮玩行业深度研究与学习】

潮玩行业发展趋势分析&#xff1a;全球市场格局与中国政策支持体系 潮玩产业正经历从"小众收藏"到"大众情绪消费"的深刻转型&#xff0c;2025年中国潮玩市场规模已达727亿元&#xff0c;预计2026年将突破1100亿元&#xff0c;年复合增长率高达26%。这一千…

进程通信-消息队列

消息队列允许一个进程将一个消息发送到一个队列中&#xff0c;另一个进程从该队列中接收这个消息。 使用流程&#xff1a; 写端&#xff1a; 使用结构体 mq_attr 设置消息队列属性&#xff0c;有四个选项&#xff1a; long mq_flags; // 队列属性: 0 表示阻塞 long …

串行通信接口USART,printf重定向数据发送,轮询和中断实现串口数据接收

目录 UART通信协议的介绍 实现串口数据发送 CubeMX配置 printf重定向代码编写 实现串口数据接收 轮询方式实现串口数据接收 接收单个字符 接收不定长字符串&#xff08;接收的字符串以\n结尾&#xff09; 中断方式实现串口数据接收 CubeMX配置 UART中断方式接收数据…

Kafka 生产者和消费者高级用法

Kafka 生产者和消费者高级用法 1 生产者的事务支持 Kafka 从版本0.11开始引入了事务支持&#xff0c;使得生产者可以实现原子操作&#xff0c;确保消息的可靠性。 // 示例代码&#xff1a;使用 Kafka 事务 producer.initTransactions(); try {producer.beginTransaction();pr…

k8s中crictl命令常报错解决方法

解决使用crictl命令时报默认端点弃用的报错 报错核心原因 默认端点弃用&#xff1a; crictl 会默认尝试多个容器运行时端点&#xff08;如 dockershim.sock、containerd.sock 等&#xff09;&#xff0c;但这种 “自动探测” 方式已被 Kubernetes 弃用&#xff08;官方要求手动…

回转体水下航行器简单运动控制的奥秘:PID 控制和水动力方程的运用

在水下航行器的控制领域中&#xff0c;回转体水下航行器的运动控制是一个关键课题。 今天&#xff0c;就来深入探讨一下其简单运动控制中&#xff0c;PID 控制以及水动力方程的相关运用。 PID 控制的基本原理PID 控制&#xff08;比例 - 积分 - 微分控制&#xff09;是一种广…

从入门到精通:npm、npx、nvm 包管理工具详解及常用命令

目录 1. 引言2. npm (Node Package Manager)2.1 定义与用途2.2 常见命令2.3 使用示例 3. npx (Node Package Execute)3.1 定义与用途3.2 常见命令3.3 使用示例3.4 npm 与 npx 的区别 4. nvm (Node Version Manager)4.1 定义与用途4.2 安装 nvm4.3 常见命令4.4 使用示例 5. 工具…

es6特性-第二部分

Promise 介绍和基本使用 Promise是ES6引入的异步编程的新解决方案&#xff0c;主要用来解决回调地狱问题。语法上 Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。 Promise构造函数:new Promise() Promise.prototype.then方法 Promise.prototype.ca…

java:如何用 JDBC 连接 TDSQL 数据库

要使用JDBC连接TDSQL数据库&#xff08;腾讯云分布式数据库&#xff0c;兼容MySQL协议&#xff09;&#xff0c;请按照以下步骤编写Java程序&#xff1a; 1. 添加MySQL JDBC驱动依赖 在项目的pom.xml中添加依赖&#xff08;Maven项目&#xff09;&#xff1a; <dependenc…

2025年四川省高考志愿填报深度分析与专业导向策略报告——基于599分/24000位次考生-AI

2025年四川省高考志愿填报深度分析与专业导向策略报告——基于599分/24000位次考生 摘要 本报告旨在为预估高考成绩599分、全省物理类位次在24,000名左右的2025年四川考生&#xff0c;提供一份兼具科学性、前瞻性与专业深度的志愿填报策略方案。报告严格遵循“位次法”为核心…

spring boot项目整合百度翻译

本片文章教大家怎样在spring boot项目中引入百度翻译&#xff0c;并且优雅的使用百度翻译。 首先&#xff0c;我们要了解为什么要使用翻译插件。为了支持多语言的国际化&#xff1b; 目前市面上最常见的后端国际化就是在resource资源目录下设置多个语言文档&#xff0c;这些文…

凌晨2点自动备份mysql 数据库,mysql_backup.sh

1、编写备份脚本&#xff1a;vim mysql_backup.sh #!/bin/bash DATE$(date %Y%m%d_%H%M%S) BACKUP_DIR"/data/mysql/backup" USER"backup_user" PASSWORD"backup**"# 逻辑备份所有数据库 mysqldump -u$USER -p$PASSWORD eblp | gzip > $BA…

Linux系统之Tomcat服务

目录 一、Tomcat概述 1、Tomcat介绍 2、Tomcat历史 二、Tomcat原理分析 1、Http工作原理 2、Tomcat整体架构 3、Coyote连接器架构 4、Catalina容器架构 5、Jasper处理流程 6、JSP编译过程 7、Tomcat启动流程 8、Tomcat请求处理流程 三、Tomcat安装与配置 1、单实…

FPGA芯片的供电

FPGA芯片的供电 文章目录 FPGA芯片的供电1. 外部端口供电机制2. 内部逻辑供电机制3. 专有电路供电机制4. 电源稳定性讨论总结 1. 外部端口供电机制 FPGA是专门用于数字系统设计的芯片&#xff0c;能够正确、可靠、高效地和外界其他数字电路进行通信是FPGA芯片必备的一个功能。…