C语言内存分配方式介绍

news/2025/3/18 21:07:14/文章来源:https://www.cnblogs.com/fuhao2/p/18779758

1. 静态存储区(Static Storage)

特点

  • 在程序编译时分配内存,生命周期持续到程序结束。
  • 存放 全局变量静态变量static修饰的变量)。
  • 默认初始化为零(未显式初始化时)。

示例

#include <stdio.h>int global_var;         // 全局变量(静态存储区)
static int static_var;  // 静态变量(静态存储区)void func() {static int count = 0; // 静态局部变量(生命周期持续到程序结束)count++;printf("count = %d\n", count);
}int main() {printf("global_var = %d\n", global_var);  // 输出 0(默认初始化)func(); // 输出 count = 1func(); // 输出 count = 2(静态变量保留上次的值)return 0;
}

2. 栈内存(Stack)

特点

  • 由编译器自动分配和释放,用于 局部变量 和函数调用。
  • 内存空间有限(默认几MB),生命周期与函数作用域一致。
  • 分配速度快,但超出作用域后内存会被自动回收。

示例

#include <stdio.h>void stack_example() {int a = 10;          // 栈内存分配char str[] = "Hello"; // 栈内存分配(数组)printf("a = %d, str = %s\n", a, str);
} // 函数结束时,a和str的内存自动释放int main() {stack_example(); // 输出 a = 10, str = Helloreturn 0;
}

3. 堆内存(Heap)

特点

  • 由程序员手动分配和释放(malloc, calloc, realloc + free)。
  • 生命周期完全由代码控制,空间大但管理不当会导致内存泄漏或野指针。
  • 适合动态分配不确定大小的内存(如链表、树等数据结构)。

示例

#include <stdio.h>
#include <stdlib.h>int main() {int *heap_var = (int *)malloc(sizeof(int)); // 堆内存分配*heap_var = 100;printf("heap_var = %d\n", *heap_var); // 输出 100free(heap_var); // 必须手动释放!// 动态数组示例int n = 5;int *arr = (int *)malloc(n * sizeof(int));for (int i = 0; i < n; i++) arr[i] = i;free(arr); // 释放数组内存return 0;
}

4. 常量存储区(Constant Storage)

特点

  • 存放 字符串常量const 修饰的常量。
  • 内存只读,修改会导致未定义行为(如程序崩溃)。
  • 生命周期与程序一致。

示例

#include <stdio.h>int main() {const int MAX = 100;       // 常量(可能存储在常量区或栈,取决于编译器)char *str = "Hello World"; // 字符串常量(存储在常量区)// 以下行为是非法的!// str[0] = 'h'; // 修改常量区数据会导致段错误(Segmentation Fault)return 0;
}

5. 内存分配对比表

分配方式 生命周期 管理方式 典型用途
静态存储区 程序整个运行期间 编译器自动管理 全局变量、静态变量
栈内存 函数作用域内 编译器自动管理 局部变量、函数参数
堆内存 直到调用free()释放 程序员手动管理 动态数据结构(链表、树等)
常量存储区 程序整个运行期间 只读,不可修改 字符串常量、const常量

6. 常见问题与注意事项

  1. 栈溢出:递归深度过大或局部变量占用空间过多会导致栈溢出(Stack Overflow)。
  2. 内存泄漏:未释放堆内存会导致程序占用内存持续增长。
  3. 野指针:释放堆内存后未将指针置为NULL,可能引发非法访问。
  4. 常量区修改:试图修改字符串常量会导致未定义行为。

示例(错误用法)

int *create_array() {int arr[3] = {1, 2, 3}; // 栈内存return arr; // 错误!返回栈内存地址,调用后arr已被释放
}int main() {int *p = create_array();printf("%d\n", p[0]); // 输出随机值(悬垂指针)return 0;
}

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

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

相关文章

20244226 实验一《Python程序设计》实验报告

20244226 2024-2025-2 《Python程序设计》实验一报告 1.实验内容 课程:《Python程序设计》 班级: 2442 姓名: 张毓格 学号:20244226 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编…

2025“钉耙编程”中国大学生算法设计春季联赛(2)(2 4 5,补3 6 8)

2025“钉耙编程”中国大学生算法设计春季联赛(2)(2 4 5,补3 6 8) 1002:烂人方法 #include<bits/stdc++.h> #define N 1005 #define mod 998244353 using namespace std; typedef long long ll; string a[] = {"jia","yi","bing",&quo…

.NET周刊【3月第2期 2025-03-09】

国内文章 记一次.NET内存居高不下排查解决与启示 https://www.cnblogs.com/huangsheng/p/18731382 本文讲述了一个ASP.NET Core gRPC服务迁移到Kubernetes后的内存管理问题。服务在K8s上遇到了高内存占用与副本扩展的问题,经过排查发现服务的内存请求设置正确,但未设定上限。…

Agent 智能体创作大赛+参赛小分队召集

与大家分享一个 agent 比赛「智能体全球创作大赛」。你可以用任何趁手的工具打造一个 agent,分享你对人机协作未来的畅想。大赛公告发布出去后,不少社区伙伴都表示有兴趣参与,所以我们决定建一个「RTE 参赛小分队」微信群 ,愿意一起分享想法和讨论技术,一起赶 deadline(3…

HTML打包EXE离线一机一码使用详细教程

近期有些朋友对于HTML打包EXE的网络一机一码验证和离线一机一码验证不太理解,本篇文章主要介绍离线一机一码的使用。相较于需要联网验证的方案,离线版本的优势在于无需连接服务器,通过本地生成的机器码与激活码即可完成授权验证,更适合对数据安全性要求较高,无法联网的项目…

Breach2.1

Breach2.1 信息收集 全端口扫描 ┌──(root㉿kali)-[~/vulnhub/Breach2.1] └─# nmap -sS 192.168.110.151 -p 1-65535 Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-03-18 09:39 CST Stats: 0:00:13 elapsed; 0 hosts completed (0 up), 1 undergoing ARP Ping Scan…

Breach2

Breach2.1 信息收集 全端口扫描 ┌──(root㉿kali)-[~/vulnhub/Breach2.1] └─# nmap -sS 192.168.110.151 -p 1-65535 Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-03-18 09:39 CST Stats: 0:00:13 elapsed; 0 hosts completed (0 up), 1 undergoing ARP Ping Scan…

HTML打包工具EXE工具一机一码激活码计算器小程序版

近期我们收到一些HTML一键打包EXE工具老用户反馈, 他们在使用一机一码离线功能的时候, 遇到如下的问题:外调试时突然需要激活码,手边没电脑急死人!客户现场网络受限,手机能操作就好了每次都要开电脑太麻烦,能移动端解决吗? 解决方案 针对用户集中反馈的"离线激活码…

20222227 实验一《Python程序设计》实验报告

20222227 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2222 姓名: 赫连紫阳 学号: 20222227 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 一、实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的…

【STM32】超好用的开源按键状态系统lwbtn,以及超详细的移植教程

在 button_event_handler 按钮事件处理函数中,按键按下分为:按下,释放;按下类型又分为:单击、双击、持续按下。 这每一个状态/事件,进行过后,其都会进行一次回调,即回到主函数一次,故也是分为了1、按下 2、释放 3、单击 4、双击 5、持续按下 五个回调状态。 你可以在 …

rp2040笔记[1]-使用embassy实现呼吸灯并通过命令行切换状态

使用rust的embassy在rp2040芯片核心板实现呼吸灯.摘要 使用rust的embassy在rp2040芯片核心板实现呼吸灯. 关键词 rust;embassy;rp2040;blink;pwm; 关键信息项目地址:[https://github.com/ByeIO/byeefree.rp2040_quad.embassy][package] edition = "2021" name = &quo…