精华内容
下载资源
问答
  • C语言的编译器是不检查下标越界的,以前知道这个问题,可是没有想是什么原因?  总结如下:  1,不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的...

    C语言的编译器是不检查下标越界的,以前知道这个问题,可是没有想过是什么原因?

     总结如下:
      1,不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这就会导致程序的运行速度下降,所以为了程序的运行效率,C/C++才不检查下标是否越界。
      2,不检查下标是为了给程序员更大的空间,也为指针操作带来更多的方便。如果有这个检查的话指针的功能将会大大被削弱,C的数组标识符,里面并没有包含该数组长度的信息,只包含地址信息,所以语言本身无法检查,只能通过编译器检查,而早期的C语言编译器也不对数组越界进行检查,只能由程序员自己检查确保。以及在早期的CRT函数中也不对字符串指针或数组进行越界检查,都是要求程序员确保空间足够,因此也才也才有了在VS2005之后微软提供的安全的CRT函数版本。  

      自己写了一段检测程序测试这个问题,发现如果数组下标越界了,那么它会自动接着那块内存往后写。想了一下明白了,以前说不允许数组下标越界,并不是因为界外没有存储空间,而是因为界外的内容是未知的。也就是说如果界外的空间暂时没有被利用,那么我们可以占用那块内存,但是如果之前界外的内存已经存放了东西,那么我们越界过去就会覆盖那块内存,导致错误的产生。。。

    这样就明白了,所以我们还是需要好好规划数组的下标滴。

    C语言好像没有直接取得数组长度的函数,只有取得数组所占内存大小,再除以一个元素占用的内存大小来计算数组长度。

    int a[8];
    printf("%d",sizeof(a)/sizeof(a[0]));



    展开全文
  • 旦等候电梯时间过长,他将放弃。 (3)模拟时钟从o开始.时间单位为o.1秒。人和电梯的各种动作均要耗费一定的时间 单位(简记为t),比如: 有人进出时,电梯每隔40t测试一次,若无人进出,则关门; 关门和开门各需要...
  • C语言知识结构

    千次阅读 2015-05-31 22:48:15
    长时间以来,都是在用C语言写东西。也一直在思考,如何能很好的掌握C,查很多资料,也作一些尝试,于是整理成此文。在大部分情况下,我们会写或者使用一个C库,然后被应用程序使用,运行在Linux的系统上。于是...

    很长时间以来,都是在用C语言写东西。也一直在思考,如何能很好的掌握C,查过很多资料,也作过一些尝试,于是整理成此文。

    在大部分情况下,我们会写或者使用一个C库,然后被应用程序使用,运行在Linux的系统上。于是,就有了基于C语言的知识结构:

             App
    ------------------- C API
           C, libc
    ------------------- Posix API
         Linux Kernel
    

    整体结构大致有上面的三层,五个部分。大致思路是:必须了解上层的需求,和下层能提供的功能。

    • App:使用C库的应用程序
    • C API:C库定义的API
    • C, libc:C语言和C语言标准库
    • Posix API:Linux内核定义的接口
    • Linux Kernel:Linux内核

    App

    引用程序代表这需求,该部分了解即可。你需要了解他们,然后从他们的角度去看待你写的库。

    C API

    C API是你提供给应用层序的界面,应用程序将参考它进行对接。如何定义好它,是你需要一直考虑的问题,最好的方法就是模仿,参考Posix API等的定义方试即可。

    C,libc

    对于C语言的学习,请考虑一下你写C代码的步骤:写代码、编译、运行、调试。搞定每个步骤的细节,将对你的学习有很大的提升。

    写代码

    写代码首要的问题就是Coding Style,包括:变量命名、代码的格式等。比如,Linux Kernel有自己的Coding Style,GNU项目也有它的Coding Style,还有NASA的Coding Style等等,这些Coding Style是让参与的人能够统一,不要乱了风格。若是新手,参考一个用的比较多的即可(参见Stack Overflow上的讨论),然后形成自己的代码风格。这是一个长期的过程,需要日积月累,以及长时间的思考。那么,有个问题是Coding Style有什么用?一是它有助于团队开发。二是有助于提升代码的可阅读性。三是作为新手,对提升很有帮助。具体到写代码,只要项目或模块有一致的风格即可。

    然后,就是重构,重构的意思时候,随着需求的增加,代码越来越多,原有的代码结构已经阻碍了开发的效率,需要重新整理。原来看过一本《重构:改善既有代码的设计》,好像是基于Java的,不过重构思路还是可以运用到C上面的。代码重构也是需要长期积累和思考。

    再然后就是设计模式,设计模式的意思是说,当你面对一个需求时,有特定的代码结构可以参考。那种代码结构是经过别人优化过的,你就不要再发明轮子了。当然,某个设计模式只是适用于特定的代码场景。关于C语言的设计模式,可以参考Stack Overflow上的讨论。

    关于写代码的应该不止这些,这正是我们思考的好时机。

    编译

    编译的第一步是编译工具gcc之类的,包含了对编译过程的理解。你肯定需要了解Linux的命令行工具。然后,你会用到Makefile,甚至Automake工具来让编译变得简单。再然后,你会用到Shell来自动化编译过程。

    运行

    这一块的内容,其实挺多的。不能单纯的理解为,C程序的执行。你需要考虑一个问题,我写的C代码,在运行态在干嘛。因为是跑在Linux上的,所以只需要考虑两点即可:内存和CPU。即C里面定义的所有变量,存在于内存的哪里,我该如何动态管理它们。C代码是如何运行的,若是有多个线程,它们的执行机制是什么。但实际上,这里面还有很多东西,我还在观察。

    调试

    调试的话,就是定位程序的问题,保证程序能按预期工作。可以使用gdb工具,添加足够多的日志等技术来完成。但是,毫无疑问,你若知道程序的运行原理,调试将不是一件难事。

    libc

    libc虽然不是C语言的一部分,但是,它和C语言是一体的,基本上,写任何C语言都要用到它。而且,它是一个很好的C参考。

    说到libc,不得不提C语言标准文档,比如:C99。标准文档是C语言的终极解释,通常不同的C编译器都会对标准有所支持。

    Posix API

    这部分内容不复杂,可以参考书籍《UNIX环境高级编程》。这本看起来像工具书,但是还是通读几遍吧。

    Linux Kernel

    这部分内容熟悉就好,了解内核在干嘛,在某些情况下是有帮助的。

    总结

    上面的内容只是个大纲,可执行性不强。而且他是基于Linux的,其实,其它平台也同样适用。

    若是其它语言,也同样适用,只是不同的语言侧重点不一样。比如:C++可能更多用于构建一个比较大的项目。语法、使用场景、设计模式都比C更加复杂。

    如果抽象层次再高一点的话,当你对一门语言熟悉到一定程度以后,语言将不在是问题的关键,实际的需求到语言之间的转换才是。就好比说话,说到一定程度,你关注的不是怎么说,而是如何说。

    展开全文
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其...
  • 用带参数宏代替函数可以在中断中可以节省更多的运行时间,不至于中断时间过长造成其他的处理程序无法正常运行。宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)。 ...

    在单片机中断中可以使用宏定义代替函数,减小系统运行时间。

    1.带参数宏定义的优点:

    • 用带参数宏代替函数可以在中断中可以节省更多的运行时间,不至于中断时间过长造成其他的处理程序无法正常运行。宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)。
    • 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率。
    • 提高程序的可读性,同时方便修改参数。

    2.宏定义的缺点:

    • 宏定义是没有变量类型的,所以传入参数时要注意。宏是与类型无关的。
    • 对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。
    • 由于是直接嵌入的,所以代码可能相对多一点。

    宏并不是函数,宏并不是语句,宏并不是类型定义

    此外,在使用单片机中断时,我们都知道要快进快出,减少程序在中断中的时间,以免影响中断的实时性,这个时候我们可以设置标志位,在程序的其他地方去处理。在FreeRTOS操作系统中,我们可以使用二值信号量或者任务通知的方式进行处理。

    展开全文
  • 处理C语言之vfprintf的段错误

    万次阅读 2013-07-01 11:08:48
    今天我执行了一个程序,运行了很长时间后,段错误了,我定位了一下,原来是fprintf的问题,具体是vfprintf的问题。 Program received signal SIGSEGV, Segmentation fault. 0x0098735e in vfprintf () from /lib/...

    C语言的段错误想必是每个人都遇到过,整理一下,以供学习之用。

    今天我执行了一个程序,运行了很长时间后,段错误了,我定位了一下,原来是fprintf的问题,具体是vfprintf的问题。

    Program received signal SIGSEGV, Segmentation fault. 0x0098735e in vfprintf () from /lib/libc.so.6

    调用栈为:

    #0  0x0098735e in vfprintf () from /lib/libc.so.6
    #1  0x0098e3cf in fprintf () from /lib/libc.so.6
    将fprintf换成printf就没有问题了。

    我开始认为是长度问题,导致溢出,后来我组合了各种方案,发现不是长度问题,原来是一个特殊的字符序列导致的问题,这个罪魁祸首就是%20这个字符串,它会导致vfprintf不正常运行。%20其实就是空格的url编码。

    上述主要是因为可变参数列表和格式化字符串的特性导致的,如%20s序列,它会认为是一个字符串,但是我们并没有传入一个字符串,所以程序就会有问题。一般来说只要字符串中含有%,就算没有段错误,也会出现很奇怪的输出现象。

    同理,sprintf由于也会调用vfprintf,所以应该同样也会有问题。


    原文:http://blog.csdn.net/hongchangfirst/article/details/9159217

    作者:hongchangfirst

    hongchangfirst的主页:http://blog.csdn.net/hongchangfirst


    展开全文
  • 这样将减少运行时间,提高效率。  初始化赋值的一般形式为: static 类型说明符 数组名[常量表达式]={值,值……值}; 其中static表示是静态存储类型, C语言规定只有静态存储数组和外部存储数组才可作初始化赋值...
  • C语言求幂的三种方法

    千次阅读 2021-02-05 16:30:22
    这种方法有手就行,但是运行时间往往过长 二. 快速幂 主要利用递归,它的思想类似于分治,把大问题分割为小问题,再将小问题的结果合计为大问题的解 t4=t2+t2 t^{4}=t^{2}+t^{2} t4=t2+t2 所以我们可以对
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型...
  • 难道在C语言中一个结构不能包含指向自己的指针吗? o 2.7 怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组? o 2.8 函数只定义了一次, 调用了一次, 但编译器提示...
  • 第一种 void *p; int cnt=0; p=malloc(100*1024*1024);...长时间运行内存下降–>内存泄漏(memoray leak) 新手:忘了 老手:找不到合适的时机free 地址变了,直接去free ***free了再free *** doub
  • 上架时间:2008-4-15 出版日期:2008 年4月 开本:16开 页码:571 版次:4-1 编辑推荐  本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一,在世界范围内广受欢迎,口碑极佳。  本书的...
  • 4.12 记录程序的运行时间 4.13 十进制/二进制转化器 4.14 打印特殊图案 4.15 打印杨辉三角 4.16 复杂级数的前n项和 4.17 寻找矩阵中的“鞍点” 4.18 n阶勒让德多项式求解 4.19 递归反向输出字符串 4.20 一年中的第...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
  • 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 2  1.4 新的64位机上的64位...
  • hihoCoder上的一道关于KMP算法的一道题,题目描述如下: #1015 : KMP算法 时间限制:1000ms ...Time Limit Exceeded TLE 用户程序运行时间超过题目的限制 怎么优化一下我的代码才能是它AC啊?!求大神指导啊。
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    难道在C语言中一个结构不能包含指向自己的指针吗? . . . . 3 1.7 怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返 回指向字符的指针的函数的指针的数组? . . . . . . . . . . . . . . 3 1.8 函数只定义...
  • 递归 汉诺塔 很一段时间就在纠结递归的问题,到现在也不是特别的明白,但是在这次学习的过程中起码做了一些材料的整理,也算开卷有益吧。例子其实不外乎就那么几个,关键是递归的思想,本身谭老的那本已经介绍的很...
  • 第二种修改,对于的指令序列每种操作的运行时间基本上是O(log N) — 二叉查找树(Binary Search Tree) 树在cs中是非常有用的抽象概念,本章我们将学习: 树在操作系统中的文件系统的应用 树如何能够用来计算...
  • 对于iOS的开发者,相信Objc的RunTime机制肯定都听说,了解RunTime的机制,对自己的提高不言而喻,最近在一直学习RunTime机制,对此写下点学习过程的收获,以便以后查阅,也方便理解,本人研究RunTime时间,如果...
  • TinyOS 学习笔记4

    2013-01-26 16:48:02
    进一步而言,如果一段代码运行时间过长,会影响其他代码的运行。任务的含义就是使任务中的代码在后台运行,也就是说过一会儿运行,类似于中断操作。 例如: task void computeTask() {  uint32_t i;  for (i...
  • <code class="language-cs">#include<stdio.h> #include<winsock.h> //引入winsock头文件 ...还有编译通过了运行不了,cmd窗口都没有出现,也不是一闪而的状态,就是没有出现</p>

空空如也

空空如也

1 2 3 4 5 6
收藏数 118
精华内容 47
关键字:

c语言运行时间过长

c语言 订阅