养成C编程良好习惯(不断更新.......)
2012-11-01 21:02
387 查看
兴哥教你学高质量编程
在C语言编程中,要养成良好的编程习惯。在这里举出多个例子,在这些例子中,有写是可以运行的,但我们还是应该尽力避免这些。不断更新中。。。争取每星期抽点时间写几个
例一、不要反回局部变量地址
#include <stdio.h>
int *test(void)
{
int i=10;
return &i;
}
int main()
{
int *p;
p=test();
printf("*p=%d",p);
return 0;
}
讲解:此函数可以有正常运行,但是我们还是要避免这种返回局部变量的地址的错误。很简单,子函数返回后,i不在存在,一旦原来的i地址的
内存被重新分配,那p所指向空间的内容就不在是我们原来所需要的了。
例二、避免局部变量分配空间过大。
void subfunction()
{
int aaa[60][250][1000];
}
说明:上面的情况显然不可取,aaa的大小在60M这个样子,局部变量是分配在栈中间的,尤其在单片机,嵌入式等的微内存处理器编程中,必须避免这种情况。编译时候估计就直接报错了,呵呵
例三、申请堆空间后要释放。
void subfunction()
{
char *p;
char *q;
p=malloc(120);
q=malloc(22);
rerurn p;
}
说明:在堆空间中申请的内存空间,在使用完后要及时的释放,虽然程序运行完以后,会有系统进行释放,但我们绝对不建议这么做,这将造成内存空间的浪费,与内存使用的不连续情况的出现,导致程序运行的效率低下。
例四、申请堆空间后要释放。
我们在TurboC2.0中编译:
#include "stdio.h"
fun()
{
return1;
}
main()
{
printf(/"%d/",fun(2));
getchar();
}
编译正确且输出1,这说明,在C语言中,可以给无参数的函数传送任意类型的参数。但是看看c++的情况
在C++语言中声明一个这样的函数:
intfunction(void)
{
return1;
}
则进行下面的调用是不合法的:
function(2);
因为在C++中,函数参数为void的意思是这个函数不接受任何参数。
但是在C++编译器中编译同样的代码则会出错。在C++中,不能向无参数的函数传送任何参数,出错提示“’fun’:functiondoesnottake1parameters”。
说明:无论在C还是C++中,若函数不接受任何参数,一定要指明参数为void。防止上面turbor中那个例子出现的情况。
例五、recalloc()函数使用注意点。
原型:extern void *realloc(void *__ptr,size_t __size);
ptr=realloc(ptr,new_amount);
说明:注意避免上面出现的情况,recalloc()函数申请失败时候将返回NULL,但是原来的ptr指向的内存空间还是可以使用的,上面的情况将会使原来的内存丢失,一直存于堆中,道道程序运行结束。注:ptr是原malloc()函数分配的空间。
在C语言编程中,要养成良好的编程习惯。在这里举出多个例子,在这些例子中,有写是可以运行的,但我们还是应该尽力避免这些。不断更新中。。。争取每星期抽点时间写几个
例一、不要反回局部变量地址
#include <stdio.h>
int *test(void)
{
int i=10;
return &i;
}
int main()
{
int *p;
p=test();
printf("*p=%d",p);
return 0;
}
讲解:此函数可以有正常运行,但是我们还是要避免这种返回局部变量的地址的错误。很简单,子函数返回后,i不在存在,一旦原来的i地址的
内存被重新分配,那p所指向空间的内容就不在是我们原来所需要的了。
例二、避免局部变量分配空间过大。
void subfunction()
{
int aaa[60][250][1000];
}
说明:上面的情况显然不可取,aaa的大小在60M这个样子,局部变量是分配在栈中间的,尤其在单片机,嵌入式等的微内存处理器编程中,必须避免这种情况。编译时候估计就直接报错了,呵呵
例三、申请堆空间后要释放。
void subfunction()
{
char *p;
char *q;
p=malloc(120);
q=malloc(22);
rerurn p;
}
说明:在堆空间中申请的内存空间,在使用完后要及时的释放,虽然程序运行完以后,会有系统进行释放,但我们绝对不建议这么做,这将造成内存空间的浪费,与内存使用的不连续情况的出现,导致程序运行的效率低下。
例四、申请堆空间后要释放。
我们在TurboC2.0中编译:
#include "stdio.h"
fun()
{
return1;
}
main()
{
printf(/"%d/",fun(2));
getchar();
}
编译正确且输出1,这说明,在C语言中,可以给无参数的函数传送任意类型的参数。但是看看c++的情况
在C++语言中声明一个这样的函数:
intfunction(void)
{
return1;
}
则进行下面的调用是不合法的:
function(2);
因为在C++中,函数参数为void的意思是这个函数不接受任何参数。
但是在C++编译器中编译同样的代码则会出错。在C++中,不能向无参数的函数传送任何参数,出错提示“’fun’:functiondoesnottake1parameters”。
说明:无论在C还是C++中,若函数不接受任何参数,一定要指明参数为void。防止上面turbor中那个例子出现的情况。
例五、recalloc()函数使用注意点。
原型:extern void *realloc(void *__ptr,size_t __size);
ptr=realloc(ptr,new_amount);
说明:注意避免上面出现的情况,recalloc()函数申请失败时候将返回NULL,但是原来的ptr指向的内存空间还是可以使用的,上面的情况将会使原来的内存丢失,一直存于堆中,道道程序运行结束。注:ptr是原malloc()函数分配的空间。
相关文章推荐
- 如何养成良好的 C++ 编程习惯(1)—— 内存管理
- 养成良好的编程习惯(Java, python)
- 养成良好编程习惯--编程规范
- 如何养成良好的 C++ 编程习惯(1)—— 内存管理
- 养成良好的编程习惯
- 如何养成良好的 C++ 编程习惯(1)—— 内存管理
- 养成良好的编程习惯
- 养成良好的java编程习惯
- 编程的良好习惯(持续更新)
- 养成良好的编程习惯,一定要给参数加上修饰符。
- 养成良好编程习惯-写伪代码
- [置顶] 养成良好的编程习惯-一个库一个文件夹
- 一个教训:养成良好的编程习惯的重要性
- 养成良好编程习惯
- 代码编程:(一)养成良好的编码习惯
- 养成良好的编程习惯,提高代码质量
- 养成良好的编程习惯-一个库一个文件夹
- 养成良好的java编程习惯
- 养成良好的C++编程习惯(持续更新)
- 如何养成良好的 C++ 编程习惯(一)—— 内存管理