C语言--重要知识点随手记(常见返回值、数据储存区)

一、常用函数返回值

1、printf

printf返回值为读到字符个数,比如39,那么返回值为2。
但是需要注意的是:字符包括数字、字母、标点符号、空格等

☃️比如这个多加了一个\n,那么返回值也加一
在这里插入图片描述
☃️如果不加\n,返回值就变成2了
在这里插入图片描述

2、getchar

只能用来读取字符,如果读取正常,返回值为字符的ASCII值(整型),否则为EOF(-1),如图
在这里插入图片描述
☃️注意:getchar每次只能读取一个字符,并且返回值为字符的ASCII值(整数)

3、scanf

如果读取正常,返回值为读到的个数,比如输入2 3,返回值为2 。输入23,返回值为1,否则为EOF(-1)
在这里插入图片描述
读取失败图,需要三次读取失败的操作是VS2019的问题。在这里插入图片描述
☃️注意:scanf返回EOF(读不到数字)需要自己手动结束才能返回,否则他会一直等待,直到输入缓冲区有数字继续读取。如图
在这里插入图片描述

二、C语言数据储存区

☃️栈区

栈在程序中用于以维护函数调用上下文,且函数中的参数和局部标量储存在栈区。
扩展:
🎷ebp是当前函数的存取指针,即存储或者读取数时的指针基地址(栈底)
🎷esp时当前函数的栈顶指针。
🎷每一次发生函数的调用(主函数调用子函数)时,在被调用函数初始时,都会把当前函数(main函数)的ebp压栈,以便从子函数回到主函数时能够获取ebp。esp就是一直指向栈顶的指针,而ebp仅仅是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等。

🌈开辟时:
调用函数时,需要去开辟一个栈区空间,这时ebp跑到esp位置,esp减一段大小(栈区使用地址是从高地址向低地址开辟),这样ebp去的原来esp的地址就变成了栈底,esp的新地址为栈顶。在这片新开辟的区域内,程序会先自动初始化这里面的内容(全部为C)(这就是我们如果不给函数定义,那么可能打印出几个烫),然后分配一些区域给局部变量等。

🌈结束时
新开辟的这一段栈区被释放,如果有返回值的话,它会先存放在寄存器中,等esp和ebp回归到原来main函数的栈区后,寄存器的值会返回给main函数中对应的数据。

🌈注意:
形参只是实参的临时拷贝,在函数调用之前,会进行压栈,把函数要传递的参数从右向左开始压栈,然后供调用的函数使用。

☃️堆区

概念:堆是程序中一块预留的内存空间,可由程序自由使用,堆中被程序申请使用的内存在被主动释放前将一直有效。C语言程序中通过库函数的调用获得堆空间
•头文件:malloc.h
•malloc:以字节的方式动态申请堆空间
•free:将堆空间归还给系统

☃️静态区

🎷静态存储区随着程序的运行而分配空间
🎷静态存储区的生命周期直到程序运行结束
🎷在程序的编译期静态储存区的大小就已经确定
🎷静态存储区主要用于保存全局变量和静态局部变量
🎷静态存储区的信息最终会保存到可执行程序中

☃️总结

1.栈、堆和静态存储区是程序中的三个基本数据区
2.栈区主要用于函数调用
3.堆区主要用于内存的动态申请和归还
4.静态存储区用于保存全局变量和静态变量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值