• C语言编程积累2


    版权声明:本文为CSDN博主(天才2012)原创文章,未经博主同意不得转载。

    https://blog.csdn.net/gzzaigcn/article/details/27113957

    寥寥数笔,记录我的C语言盲点笔记,仅仅为曾经经历过,亦有误,可交流。

    1.implict declartion of function 指的是在预处理时没有函数的申明,但该函数在别的函数中进行了编译与调用。编译能够完毕链接可是会给出warning。须要提前申明

    2. sizeof是一个operand操作符,不能直接对其进行&取地址操作。

    是一个编译器自己主动算大小的函数,在预处理时。和宏定义有所相似。

    sizeof当然不是函数。它是编译的时候处理的
    编译时,编译器判断出sizeof參数的类型,sizeof依据这个类型确定一个整数,所以它能够当常量使用
    函数肯定不能当常量使用,函数仅仅能执行时求值

    3.
    1.C语言中,对结构体指针赋值为NULL时,在未对其进行再次改动前,不同意对该结构体取值。由于NULL=0,取0处的内容,程序执行时会出现段错误Segmentation fault。不要对NULL地址取值。这个错误使得在调用须要指针的函数的最好不要传入指针变量,除非自带获取过一个地址如malloc,calloc等。不然这个地址默认是0,一旦在函数内部发生取值赋值时,就会出现段错误。

    段错误往往是有对内存的不正当操作引起。使的程序在执行是侵占内存,系统检測到后强制终止程序执行,以防止系统死机。



    2.在使用malloc使要确定是否分配所需的内存大小。不然程序訪问超出的那些内存时往往不在是你原本想象的数值,系统已经将这些内存自我实现了回收机制,仅仅留下你申请的那部分。

    或许你能再次訪问到这块内存,可是终于的结果肯定是内存已经回收清空,系统这样做的优点就是看不是堆内存链表中的区域。自行回收,使系统更高效。




    4.C语言中优良的编程习惯
    #ifndef _H_FINGER_API_H_
    #define _H_FINGER_API_H_
    #ifdef __cplusplus
    extern "C" {
    #endif


    #ifdef __cplusplus
    extern "C" }
    #endif

    这种优点在于定义的头文件在一个c源文件里出现多次时,也不会出现反复的函数申明,同一时候这个也能够将c非常方便的移植到c++去中去。


    5 C语言中,对结构体指针赋值为NULL时。在未对其进行再次改动前,不同意对该结构体取值,由于NULL=0,取0处的内容。程序执行时会出现段错误Segmentation fault。
    不要对NULL地址取值。


    6,for(n = 0 ; n < nLen ; n++)和for(int n = 0 ; n < nLen ; n++)
    这两个的差别在与后者的n仅仅能在for这个区域中生效,前者在整个函数域内有效。后者的n不能在for外部使用。c中前者的使用较为理想。

    C99的标准


    7,函数间数据的传递也能够考虑使用memcpy来对暂时缓存进行拷贝。

    可是要记得不能在函数内部把一个暂时缓存区的地址覆给一个传入的指针变量。

    由于结束后这部发内容被清空,无意义(除非用malloc申请的内容)


    8.全局变量可不能够定义在可被多个.C文件包含的.,h头文件里?为什么?
    恩,不能够在多个.c文件使用含有全局变量(已经定义即初始化)的.h文件,由于每一个文件域都有了这个全局变量后。在编译连接时,编译器识别到两个全局变量而且都要分配地址,这种话在放入全局变量区之前就出现连接报错。
    解决方法:
    1.在.h中申明为extern int a 或者在其它。

    c文件文件里声明extern int a。这样这个全局变量编译时就不会报错

    可是这个假设仅仅有在一个.c文件里出现定义define或者初始化时。而其它.c仅仅是申明的话,那么这个全局变量就不会报错。

    一般假设变量定义了就会分配内存的。出现多个申明,默认找已经定义的那个作为全局数值。

    2.对两个相同的变量都加static,就能够。由于仅仅在自己的文件域内有效,在函数的使用方法也相似

    关键是不同意在.h中定义的全局变量两赋初值(即定义)!

    ,由于.h中赋值后,多个文件一旦使用,就相当与反复了两次变量的初始化赋值。这个不同意。




    9.在编码中。在.h的头文件里养成仅仅做函数和变量的申明。在.c文件里来详细实现,以及全局变量的定义等等。

    10全部未加static前缀的全局变量和函数都具有全局可见性。其它的源文件也能訪问

    11
    Linux以下的文件换行符为 (0x0a),差别于window以下的 (两个字节)
    Linux以下EOF 为-1二进制文件为0xff.(-1补码)
    EOF是文本文件结束的标志。window下在文本文件里。数据是以字符的ASCⅡ代码值的形式存放。普通字符的ASCⅡ代码的范围是32到127(十进制)。EOF的16进制代码为0x1A(十进制为26),因此能够用EOF作为文件结束标志
    文本方式 和 二进制方式 的不同在于。

     
    1. 文本方式仅仅能读取不包含控制字符(换行除外)的文件 (<32)
    2. 文本方式会对换行执行翻译。比方windows下,把文件里的/r/n翻译为/n,把写入文件的/n翻译为/r/n;unix下,把文件里的/n翻译为/n,把写入文件的/n翻译为/n。


    12.传入函数的指针假设是须要使用的有必要对其进行NULL检測。

    13.C语言中的申明不一定仅仅是申明,int a;系统会给默认的定义值。可是定义int a=1。一定是定义。
    还有extern int a;则一定是申明。定义在其它地方,这里仅仅是引用而已。

    加externkeyword的声明不是定义而且不分配内存(实际上声明是不分配内存的)。实际上,它仅仅是宣称了已经在其它文件里定义的变量的名称和类型。一个变量能够声明多次,可是仅仅能定义一次。声明仅仅有在他相同是定义时才干初始化,由于仅仅有定义才会分配内存

    14。在使用数组或者某些结构体前。最好完毕对其的初始化{0}.memset或者bzero等,由于在局部函数内部,编译器分配的栈空间。初始数值并非为0.须要先初始化为须要的默认值,不然有可能对你兴许程序有影响,而造成比方Segmentation fault(经常是对内存操作出现的错误比較操作的内容块小于分配的大小等等)


    15missing braces around initialize
    该问题是在结构提中有多个数组在初始化时。没有对每一个进行初始化,从而会出现这个错误如
    typedef struct Usr_Info{
        unsigned char ID[ID_LEN];
        unsigned char Finger[FMD_LEN];
        unsigned int  finsih_flag;// 1:one usr info get finsihed
    }USR_INFO;
    初始化USR_INFO one = {0},会出现警告,须要对每一部分的数组进行初始化。就这样{{0}.{0}.0}。C99的特点


    16
    ANSI C说明了三个用于存储空间动态分配的函数
    (1) malloc   分配指定字节数的存储区。此存储区中的初始值不确定
    (2) calloc   为指定长度的对象,分配能容纳其指定个数的存储空间。

    该空间中的每一位(bit)都初始化为0
    (3) realloc  更改曾经分配区的长度(添加或降低)。当添加长度时,可能需将曾经分配区的内容移到还有一个足够大的区域,而新增区域内的初始值则不确定


    17 a[]用作函数參数。会退化成指针。即和*a一样。这样写看上去上更明白一点

    18,static申明的函数被同一文件内的函数调用后。这个非static的函数照样能够被其它文件的函数调用,从而能够说是间接的进行了调用static函数。

    lld打印64位数据类型。

    unsigned long long :lld,64位
    long unsigned int: ld = unsigned long int一样
    以上是C99中新加的

    20。fread(以r读的方式打开),fwrite(以a追加的方式打开)假设是操作2进制文件则加为rb,ab

    21.
    參数入栈时。不足int的,扩展为int后入栈
    比方char(-127)扩展成int(-127)
    也就是由 10000001 扩展成 11111111 11111111 11111111 10000001
    然后你使用%u,也就是将 11111111 11111111 11111111 10000001 当成 unsigned int 来看。那它当然就是 4294967169 了

    22
    关于类型提升。有符号扩展, 我看了下《Linux C一站式编程》 的15章的3.5节 “编译器如何处理类型转换”的最后一段。 里面最后一段说:
    “最后一个样例,把short型转换成int型。相应表中的“signed integer to signed integer”。转换之后应该值不变。那怎么维持值不变呢?是不是在高位补16个0即可了呢?假设原值是-1,十六进制表示就是ffff,要转成int 型的-1须要变成ffffffff,因此须要在高位补16个1而不是16个0。换句话说。要维持值不变,在高位补1还是补0取决于原来的符号位,这称为符号扩展(Sign Extension)。


       
    这是signed integer to signed integer, 为何signed char转为unsigned int时 。也运用了符号扩展??


    23宏定义中使用来屏蔽换行符,这样后面的内容都能够是该宏定义块的内容,直到出现换行符后就意味着该宏内容结束。

    24. 指针与静态数组的sizeof操作
          指针均可看为变量类型的一种。全部指针变量的sizeof 操作结果均为4。


    注意:int *p; sizeof(p)=4;
                      但sizeof(*p)相当于sizeof(int);      
          对于静态数组。sizeof可直接计算数组大小。
          例:int a[10];char b[]="hello";
                  sizeof(a)等于4*10=40;
                  sizeof(b)等于6;
     注意:数组做型參时。数组名称当作指针使用!


                   void  fun(char p[])
                   {sizeof(p)等于4}   


    25.C语言复合执行:原则是从右向左依次赋值。能够节省内存开销
    a*=a;a=-a;a+=a;a/=a。a|=a;a&=a,a^=a;a=~a(取反)。
    负数的取反和变号不一样。取反对每一位包含符号位做取反操作,取负就是原值变换符合后的补码,原数是正,则是负数的补码存在,原数是负。则以正数的原码存在(正数原码和补码一样)

    26. C语言中的volatile告知编译器。这个变量不要被编译器优化成寄存器间接訪问变量。不管什么情况下都要使用直接訪问(防止特殊的改变,经常指的是硬件引起的变换),volatile易失的,不稳定的
    1. volatile变量可变同意除了程序之外的比方硬件来改动他的内容   
    2. 訪问该数据不论什么时候都会直接訪问该地址处内容。即通过cache提高訪问速度的优化被取消。


    27 int bit0:1什么意思
    位域是指信息在存储时,并不须要占用一个完整的字节, 而仅仅需占几个或一个二进制位。为了节省存储空间,并使处理简便。C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域。并说明每一个区域的位数。每一个域有一个域名,同意在程序中按域名进行操作。

    这样就能够把几个不同的对象用一个字节的二进制位域来表示

    typedef union{
    unsigned char value;
    struct
    {
    unsigned int bit0:1;
    unsigned int bit1:1;
    unsigned int bit2:1;
    unsigned int bit3:1;
    unsigned int bit4:1;
    unsigned int bit5:1;
    unsigned int bit6:1;
    unsigned int bit7:1;
    } bit_field;
    } PORT;

    28 fstat获取文件的大小等基础信息。ftruncate改变文件大小
    ftruncate(fd,length),改为length的长度
    
    
    
    

  • 相关阅读:
    0713学期末了
    Oracle Redo日志的状态
    crontab调用shell访问sqlplus失败原因
    Solaris下批量杀进程
    oracle用户管理的完全恢复4:在ARCHIVELOG 模式(恢复打开的数据库)
    oracle用户管理的完全恢复3:在ARCHIVELOG 模式(恢复关闭的数据库)
    shell删除所有空行(忽略编码格式)
    oracle用户管理的完全恢复1:在NOARCHIVELOG 模式下执行恢复
    查看oracle用户权限
    OLTP与OLAP介绍
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10713237.html
Copyright © 2020-2023  润新知