C语言中的内存深入剖析

本文深入探讨了C语言中的内存管理,包括四个主要区域:代码区、静态区、栈区和堆区。详细讲解了各区域的特性、变量的内存布局、生命周期和作用域,通过实例分析了不同编译器下的行为差异。重点讨论了栈和堆的使用限制,以及内存泄漏的概念。
摘要由CSDN通过智能技术生成

1.c语言中的内存区域

C语言程序在内存执行时主要分为四个区:代码区、静态区、栈区、堆区(还有更细的分法,此为常用的)

(1)代码区

存放:程序执行的代码、一些只读的常数变量(如字符串常量

这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读 。

代码演示:

#include<stdio.h>

int main(void)
{
	char str[] = "你好";             
	char *p_str = "http"; //顺便提一下,这句在g++编译器中无法通过,C++中字符串常量为const char[],不允许转换为char*

	printf("%p, %p, %p\n", str, p_str, main);

	str[0] = '1';   //str在栈区中,可读可写,在赋值过程中,将字符串常量复制了一份给到栈区中的str[],此处运行没有问题 
	printf("%s\n", str);

	//*p_str = '1';   // 执行到这句程序崩溃,因为此时指针p_str指向的地址是字符串常量(存放在代码区),只读区域不能写
	//printf("%s\n", p_str);

	return 0;
}

运行结果:

从上述结果可以发现main函数和字符串常量在同一区域,其实都在代码区,并且代码区只读不可修改。

(2)静态区

存放:全局变量、静态变量                       

生命周期:程序运行时开始,直到程序结束(在程序运行期间都占用内存)

静态区存储的内容在程序加载到内存的时候就确定

可读可写

代码演示:

#include <stdio.h>

int g_a = 0;        	// 全局变量
static int s_c = 0;		// 全局静态变量

void test(void)
{
	static int s_d = 0;	// 局部静态变量
	static int s_e = 0;	// 局部静态变量
	int i = 0;			// 局部变量
	
	printf("&s_d = %p, &s_e = %p, &i = %p\n", &s_d, &s_e, &i);
}

int main()
{
    int i = 0;
	
	// 打印变量的内存地址
    printf("&g_a = %p, &s_c = %p, &i = %p\n", &g_a, &s_c, &i);

	test();
    return 0;
}

运行结果:

可以发现,对于全局静态变量它们随着定义依次存放在同一个区域

(3)栈区

存放:普通局部变量(非static

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值