一、常用函数返回值
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.静态存储区用于保存全局变量和静态变量