level 5
西安恩仪联教育
楼主
c语言是一个函数式的语言,函数是组成c程序基本单位,不管用c语言编写驱动程序、应用程序或者某种算法都离不开对函数设计和使用。我见过很多初级c程序员设计很多糟糕的函数,导致项目功能受限、难以修改和维护等众多问题。
本文是对入职的初级工程师进行技术培训时总结的资料,围绕函数设计的问题进行展开。

问题一:指针作为函数的参数
1、乱使用,对传值和传指针混淆。
2、什么情况使用指针作为参数不清楚。
指针作为参数,达到传数据给子函数或者将子函数数据传递给调用函数的目的。
主函数传递多个数据给子函数,传递指针;反过来子函数传递多个数据给主函数,也是通过传递指针方式实现。
如果函数返回值被占用,通过传递指针可以再返回数据
问题二:函数返回值
1、函数没有返回值,调用之后没有效果。
2、仅考虑函数在一种情况下的返回值,不考虑其它情况。
函数设计应该考虑返回值,应该考虑各种情况下函数的返回值
问题三:函数中随意出现测试语句
1、函数中用printf显示内存单元值,代替返回值
2、函数中用scanf接收数据,代替函数参数
printf和scanf是测试语句,不应该出现在子函数中,在main中使用测试子函数功能是否实现
问题四:函数的形式参数和函数内部局部变量区别
1、分不清函数形参和局部变量
2、 对函数的形式参数作用不理解
典型错误:
void fun(int data)
{
data = 值;
}
函数内部局部变量和形式参数都是局部变量,作用范围一致,局部变量是内部使用的外面不需要知道,形式参数是用来接收外部数据的。
问题五:出现内存泄漏和野指针
1、函数内部动态分配的空间,函数结束时未释放。
2、返回栈空间的地址,即函数内部静态申请空间指针。
函数内部释放空间,在函数退出是必须释放,否则容易造成内存泄漏;不能返回值栈空间的地址,否则造成也指针,如果函数返回值是指针,则必须确保函数结束时,指针指向的空间合法。
问题六:代码书写混乱
1、不按照要求使用空行和空格
2、不缩进,不对齐
3、不加注释
仔细阅读公司的代码编程规范,严格按照编程规范书写代码
问题七:变量不初始化
1、定义普通变量不初始化,是随机值
2、定义指针变量不初始化,是野指针
3、定义结构体变量不初始化,是随机值
函数中定义任何变量都必须初始化,不管是静态申请或者是动态申请都需要初始化
问题八: 指针作为参数是否用const修饰
1、指针作为函数的参数,从来不用const修饰
2、不理解const作用和意义
例如:
char *strcpy(char *dest, const char *src);
int strcmp(const char *s1, const char *s2);
指针作为函数的参数,在函数内部如果通过指针仅是读取,不修改,应该用const修饰参数。
如果通过指针修改所指向的空间,则不用const修饰。
问题九:函数返回值是指针
1、将函数内部malloc的空间指针直接返回。
2、将函数内部静态申请的空间的指针返回。
以上两种情况会导致内存泄漏和野指针,函数返回值是指针要小心,确保函数执行完之后指针指向的空间是合法且可用的。
问题十:子函数中出现一个整数
1、随意在函数中使用整数
2、函数内部定义数组是随意出现100,50这样的字眼
子函数中不要随便出现一个整数,如果出现有充分理由并且用宏代替,做到见名知意
2025年10月08日 10点10分
1
本文是对入职的初级工程师进行技术培训时总结的资料,围绕函数设计的问题进行展开。

问题一:指针作为函数的参数1、乱使用,对传值和传指针混淆。
2、什么情况使用指针作为参数不清楚。
指针作为参数,达到传数据给子函数或者将子函数数据传递给调用函数的目的。
主函数传递多个数据给子函数,传递指针;反过来子函数传递多个数据给主函数,也是通过传递指针方式实现。
如果函数返回值被占用,通过传递指针可以再返回数据
问题二:函数返回值
1、函数没有返回值,调用之后没有效果。
2、仅考虑函数在一种情况下的返回值,不考虑其它情况。
函数设计应该考虑返回值,应该考虑各种情况下函数的返回值
问题三:函数中随意出现测试语句
1、函数中用printf显示内存单元值,代替返回值
2、函数中用scanf接收数据,代替函数参数
printf和scanf是测试语句,不应该出现在子函数中,在main中使用测试子函数功能是否实现
问题四:函数的形式参数和函数内部局部变量区别
1、分不清函数形参和局部变量
2、 对函数的形式参数作用不理解
典型错误:
void fun(int data)
{
data = 值;
}
函数内部局部变量和形式参数都是局部变量,作用范围一致,局部变量是内部使用的外面不需要知道,形式参数是用来接收外部数据的。
问题五:出现内存泄漏和野指针
1、函数内部动态分配的空间,函数结束时未释放。
2、返回栈空间的地址,即函数内部静态申请空间指针。
函数内部释放空间,在函数退出是必须释放,否则容易造成内存泄漏;不能返回值栈空间的地址,否则造成也指针,如果函数返回值是指针,则必须确保函数结束时,指针指向的空间合法。
问题六:代码书写混乱
1、不按照要求使用空行和空格
2、不缩进,不对齐
3、不加注释
仔细阅读公司的代码编程规范,严格按照编程规范书写代码
问题七:变量不初始化
1、定义普通变量不初始化,是随机值
2、定义指针变量不初始化,是野指针
3、定义结构体变量不初始化,是随机值
函数中定义任何变量都必须初始化,不管是静态申请或者是动态申请都需要初始化
问题八: 指针作为参数是否用const修饰
1、指针作为函数的参数,从来不用const修饰
2、不理解const作用和意义
例如:
char *strcpy(char *dest, const char *src);
int strcmp(const char *s1, const char *s2);
指针作为函数的参数,在函数内部如果通过指针仅是读取,不修改,应该用const修饰参数。
如果通过指针修改所指向的空间,则不用const修饰。
问题九:函数返回值是指针
1、将函数内部malloc的空间指针直接返回。
2、将函数内部静态申请的空间的指针返回。
以上两种情况会导致内存泄漏和野指针,函数返回值是指针要小心,确保函数执行完之后指针指向的空间是合法且可用的。
问题十:子函数中出现一个整数
1、随意在函数中使用整数
2、函数内部定义数组是随意出现100,50这样的字眼
子函数中不要随便出现一个整数,如果出现有充分理由并且用宏代替,做到见名知意