C语言的变量

一个变量的三大特点

1、变量的数据类型:整型等
2、变量的作用域:局部变量和全局变量

3、数量的存储类型:register、static、auto


变量的储存和调用:


当一个可执行文件被执行(./a.out),即创建一个进程。此时,系统会为进程分配活动空间,此空间一般为虚拟空间,一般为4GB。操作系统不会通过完整映射将虚拟内存映射到物理聂村上上(那样做也不够),而是调用MMU这个软件,通过写时复制的功能将需要处理的文件映射到内存上。
写实复制:比如说有2MB的数据需要处理(一共1GB的数据),那此时就将2MB的数据搬到物理内存中进行处理

进程空间分布图



栈空间(由系统管理):局部变量、函数形参、自动变量(auto)
堆空间:malloc、ralloc、caollc等函数
全局数据区(分三块):
1、bss段:未初始化的全局变量
2、or段(only read):系统常量(不可修改)
3、静态数据储存区:由static修饰的变量


例子:
char *ptr()
{
    char ptr[] = "hello world";
    return ptr;
}
int main()
{
    int *ptr = ptr();
    printf("%s\n",ptr);
}
结果是不可被打印出的,因为ptr被分配在栈空间,在调用时已经被释放掉了,将第三行修改为:static char ptr[] = "hello world";即可,将ptr分配至堆空间
如果将数组修改为指针变量,就不会报错,因为此时的hello world为全局变量,不会释放


全局变量的局部变量区别:
1、未初始化的全局变量储存在全局数据区的bss 段,而局部变量分配在栈空间
2、未初始化的全局变量的默认值为0,未初始化的全局变量的值不确定
3、全局变量的作用域的整个程序,而局部变量的作用域为整个函数


例子:
int main()
{
    cahr *ptr = "hello world";
    *ptr = "L";


    printf("%s\n",ptr);
}
会报错,因为ptr数值在全局数据区的or段,不可 修改其值


函数的声明和定义:

1、声明不分配空间,定义分配空间
2、声明可多次,定义只有一次


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值