C 中需要注意的问题!

1. 数据下标溢出问题  

  编译器不对数组下标做合法性检查。因此,编写程序时,如果下标值是从那些已知是正确的值计算得来,那么无需检查它的值;但是,如果下标是依据某种方法从用户输入的数据产生而来,那么使用前必须进行合法性检测,确保其不会越界。

2.typedef 与 #define

  使用typedef可以定义数据类型的新名字,这样,当你需要修改程序类某些数据的类型时,将减少工作量和错误率。

  #define 只是在编译时进行字面替换,某些情况可能会出现很难检测的错误。

    如:      typedef  char *  prt_to_char   //把标识符ptr_to_char作为指向字符的指针类型的新名字

        #define   prt_to_char_bad  char *  //编译时prt_to_char_bad被替换为char*

        prt_to_char a, b;   // 声明a, b是指向字符的指针变量

        prt_to_char_bad c, d;   //声明c是指向字符的指针变量, 而d是字符型变量

3.作用域、链接属性和存储类型

变量的位置 变量类型 存储位置 作用域 如果声明为static
所有代码块之外 全局,其他源文件可以访问,其他源文件中声明时建议加上extern,用以标明访问此处的外部变量。 静态存储区,初始化为0 从声明处到文件尾  不允许从其他源文件访问
代码块起始处  局部变量 堆栈,初始值无意义 整个代码块 存储在静态存储区,程序执行期间一直保持。也不能从其他源文件访问。当多次调用该函数时,上一次调用函数产生的值会传递给下一次调用。
函数头部 形式参数 堆栈 整个函数 不允许

  

4. switch (expression):  expression 的结果必须为整型值。

5.有符号数的右移操作不可移植!!!

6. EOF为整型, 输入EOF(在 Windows/MS DOS 系统下:新起一行,按住 ctrl ,然后再按下 z ;在 Unix/Linux 下: ctrl + d

             while (  ( ch = getchar() ) != EOF ) 

             这条语句在使用有符号集的机器上运行时,如果读取了一个值为\377的字节时,循环将终止,因为这个值截短再提升之后于EOF相等。   当运行在无符号字符集的机器上时,这个循环将永远不会终止!

7. C中没有boolean类型,0为false, 非0均为true。

8.中文输入法惹得祸

  编译提示:“程序中有游离的 \377”。 检查输入的字符,是否有中文输入法输入的。

原文地址:https://www.cnblogs.com/hilnx/p/2781580.html