内存管理-

本文详细介绍了C语言中的内存管理,包括变量的作用域(局部、全局、静态局部和静态全局),函数(全局和静态函数)的作用域,以及数据在内存中的存储位置(栈、堆、代码区、数据区、BSS区)。同时,讨论了内存布局和内存操作函数如memset、memcpy、memmove和memcmp,并提醒开发者注意内存越界和释放等问题。
摘要由CSDN通过智能技术生成

作用域

C语言变量的作用域分为:

  • 代码块作用域(代码块是{}之间的一段代码)
  • 函数作用域
  • 文件作用域

局部变量

局部变量也叫auto自动变量(auto可写可不写),一般情况下代码块{}内部定义的变量都是自动变量,它有如下特点:

  • 在一个函数内定义,只在函数范围内有效。
  • 在复合语句中定义,只在复合语句中有效。
  • 随着函数调用的结束或复合语句的结束局部变量的声明声明周期也结束。
  • 如果没有赋初值,内容为随机。

全局变量

  • 在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明。
  • 全局变量的生命周期和程序运行周期一样。
  • 不同文件的全局变量不可重名。
  • 全局变量可以和局部变量重名,数据在操作时会采用就近原则。
    示例:
#include<stdio.h>

//数据区   全局变量可以和局部变量重名
//全局变量   在函数内部定义的变量
//作用域:整个项目中的所有文件,如果在其他文件中使用需要声明(extern)
//生命周期:从程序创建到程序销毁
int a = 10;

void fun02()
{
   
	a = 100;
	printf("%d\n", a);
}
int main()
{
   
	//数据在操作时会采用就近原则
	printf("%d\n", a);//打印结果为10
	int a = 123;

	//匿名内部函数
	{
   
		int a = 456;
		//a = 789;//因为不是定义的,使用的是外部的a,所以外部打印为789
		printf("%d\n", a);//打印结果为456
	}

	printf("%d\n", a);//打印结果为123
	fun02();//打印结果为100
	fun03();//打印结果为100,在调用fun02时已经将a的值改变
	return 0;
}
#include<stdio.h>

extern int a;//声明全局变量a
void fun03()
{
   
	printf("%d\n", a);
}

结果:

10
456
123
100
100

静态局部变量

  • static局部变量的作用域也是在定义的函数内有效。
  • static局部变量的生命周期和程序运行周期一样,同时staitc局部变量的值只初始化一次,但可以赋值多次。
  • static局部变量若未赋以初值,则由系统自动赋值:数值型变量自动赋初值0,字符型变量赋空字符。
    示例:
#include<stdio.h>

void fun04()
{
   
	//静态局部变量指挥初始化一次,可以多次赋值
	//在数据去进行存储,不会根据栈区的变换而变换
	//作用域:只能在函数内部使用
	//生命周期:从程序创建到程序销毁
	static int b = 10;
	b++;
	printf("%d\t", b);
}

int main(void)
{
   
	static int b = 10;//静态局部变量
	for (int i = 0; i < 10; i++)
	{
   
		fun04();
	}

	return 0;
}

结果:

11      12      13      14      15      16      17      18      19      20

静态全局变量

  • 在函数外定义,作用范围被限制在所定义的文件中。
  • 不同文件静态全局变量可以重名,但作用域不冲突。
  • static全局变量的生命周期和程序运行周期一样,同时staitc全局变量的值只初始化一次。

变量总结

在这里插入图片描述

  • 未初始化的局部变量值为乱码。
  • 未初始化的静态局部变量值为0。
  • 未初始化的全局变量值为0。
  • 未初始化的静态全局变量值为0。

全局函数和静态函数

全局函数

  • 在C语言中函数默认都是全局的。
  • 全局函数的名字是唯一的。
    示例:
    主程序
#include<stdio.h>

//函数可以调用自己,称为递归函数
void BubbleSort(int*, int);//家里声明后就可以转到定义了,
int main(void)
{
   
	int arr[] = {
    9,2,7,5,4,8,1,3,6,10 };
	//全局变量的名称在作用域中是唯一的
	//作用域:在整个项目中的所有文件中使用
	//生命周期:从程序创建到程序销毁
	BubbleSort(arr, 10);
	for (int i = 0; i < 10; i++)
	{
   
		printf("%d\n", arr[i]);
	}
	return 0;
}

函数程序

#include<stdio.h>

//冒泡排序函数
void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值