首页
登录 | 注册

对一个C语言小程序的剖析

说实话,做工程师这么多年了,也很尴尬,一是没有所谓的工程师证,也不知道什么是高级工程师,如何评出来的;二是用了这么多年C语言,感觉自己还是没有掌握好C语言。

  今天,看了看C的基础知识时,遇到了这个程序:
   
#include
int swap(int *p1,int *p2)
{
    int *p;
    p=p1;
    p1=p2;
    p2=p;
    return 0;
}
int main()
{
    int a,b;
    int *pointer_1,*pointer_2;
    scanf("%d,%d",&a,&b);
    pointer_1=&a;pointer_2=&b;
    if(a         swap(pointer_1,pointer_2);
    printf("\n%d,%d\n",*pointer_1,*pointer_2);
    return 0;
}

  在最常用的那本谭老的教科书上,最常见这样的程序,分析其主要的问题:

1.定义变量没有初始化,两个变量和两个指针的变量初始未知。wKiom1M1kOqgLpsnAAG1hmASIMc930.jpg

  如上图,我们调试,两个int型变量和指针变量的傎都是随机的,在项目中可能造成很严重的后果,如在开机启动时,如果两个变量代表着真实项目中的电流,这个地方可能要误报警,造成严重的事故。

2.野指针出现了,也叫做悬垂指针,如果这是个服务器程序,总有一天会出现问题。wKiom1M1k5HAkImnAAEh13_q86s584.jpg

  如果这个程序长期运行,这两个指针成了野指针,总会出问题的。只是这个程序小,用作小例子,造不成大的问题,但这样使用指针的方法,早晚会付出代价。

3.企图通过改变指针形参的值而使指针实参的值改变
   
int swap(int *p1,int *p2)
{
    int *p;
    p=p1;
    p1=p2;
    p2=p;
    return 0;
}

这个程序出现了问题,我们运行一下程序,发现并没有按我们要求输出大小数,原因就是函数传参数时,只是对实参做了一份拷贝,使用指针做函数形参时,这里只是对两个形参做了一下交换,局域函数退出时,形参也就消亡了,并没改变实参指针所指向的内容。

  通过以上分析,我们得到正确的程序如下:
   
#include
int swap(int *p1,int *p2)
{
    int temp=0;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
     return 0;
}
int main()
{
    int a=0,b=0;
    int *pointer_1=NULL,*pointer_2=NULL;
    scanf("%d,%d",&a,&b);
    pointer_1=&a;pointer_2=&b;
    if(a         swap(pointer_1,pointer_2);
    printf("\n%d,%d\n",a,b);
    pointer_1=NULL;
    pointer_2=NULL;
    return 0;
}

  虽然,这个例子很简单,但我们可以看到,学好C不大容易,正因为它太自由了,如果不使用工具一点点调试,很难提高。

  希望大家,通过这个例子,有一个好的学习方法和态度,使自己成为高手。

相关文章

  • 内建函数,顾名思义,就是编译器内部实现的函数.这些函数跟关键字一样,可以直接使用,无须像标准库函数那样,要 #include 对应的头文件才能使用. 用来处理变长参数列表: 用来处理程序运行异常: 程序的编译优化.性能优化: 查看函数运行中 ...
  • 这一节,接着讲 __atttribute__ 属性声明,__atttribute__ 可以说是 GNU C 最大的特色.我们接下来继续讲一下跟内联函数相关的两个属性:noinline 和 always_inline.这两个属性的用途是告诉编 ...
  • GNU C 增加一个 __atttribute__ 关键字用来声明一个函数.变量或类型的特殊属性.声明这个特殊属性有什么用呢?主要用途就是指导编译器在编译程序时进行特定方面的优化或代码检查.比如,我们可以通过使用属性声明指定某个变量的数据边 ...
  • 在ubuntun虚拟机里安装goLang语言编程环境
    Go语言是谷歌2009发布的第二款开源编程语言. 北京时间2010年1月10日,Go语言摘得了TIOBE公布的2009年年度大奖.该奖项授予在2009年市场份额增长最多的编程语言. 本文介绍如何在ubuntu操作系统下面安装goLang. ...
  • Java Web项目,Android和微信小程序的初始页面配置
    我们在Eclipse里开了Java Web项目之后,Run As Tomcat或者Apache服务器,本地运行,如果直接用http://localhost:8080访问项目,会发现浏览器会打开一个默认的页面. 每个Java Web工程的目录 ...
  • 剑客一直说我写的blog属于阳春白雪,很少有人看懂,以后尽量向大家灌输一些基础知识. c语言通过jvm环境可以调用java类,我以前的blog写过.http://blogger.org.cn/blog/more.asp?name=hongr ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.013 s.
京ICP备10005923号