• C语言学习笔记(四)


    1.   char *name = malloc(20);

      name = "abcdef";

    这两条语句合起来会导致内存泄露,因为name先指向堆(heap),后又指向了常量区。

    2.共用体所有的成员共用一段内存:

      union data{

        short int i;

        char ch;

      }share;

      int a = share.ch;表示用(char)的格式解释共用体所占的空间。a.任何时刻只有一个变量。b.不能在定义的时候赋值。c.同类型的共用体变量是可以整体赋值的。d.共用体变量起作用的是最后一次存放的成员。

    example:

      

    [root@localhost test]# gcc 12_13_2.c

    [root@localhost test]# ./a.out

    65

    [root@localhost test]# cat 12_13_2.c

    #include <stdio.h>

    union data

    {

            short int i;

            char ch;

    }share;

    int main()

    {

            int a;

            share.i = 65+256;

            a = share.ch;       //表示用(char)的格式解释共用体所占的空间

            printf("%d ",a); //结果是65

    }

    3.malloc()分配后不初始化数据,calloc()分配后数据初始化为零。realloc()分配后所返回的指针不一定是原来的那个指针。

    4.结构体的对齐特性:

      结构体内的元素具有对齐特性(一般是4字节对齐),结构体本身也有对齐特性(与其所占内存最大的那个元素的大小对齐)。而且整个结构体的长度必须是齐对齐特性的倍数。

      两个同类型的结构体可以整体赋值,如

      struct AnyOne a, b;

      a = b;    //这是可以的

    5.NULL在C和C++中的定义:

      

      #undef NULL

      #if defined(__cplusplus)

        #define NULL 0

      #else

        #define NULL ((void *)0)

      #endif

    6.查看堆(heap)的分配和释放:

      [root@localhost test]# valgrind --tool=memcheck --leak-check=full ./a.out

    7.umask的作用:将对应的位取反,若umask=022,则将组和其他用户的w权限清零。

    8.判断一个变量是不是无符号数:

      #define IS_UNSIGNED(a)   ((a >= 0) ? (~a > 0 ? 1 : 0) : 0)

    9.

    [root@localhost test]# cat 12_13_4.c

    #include <stdio.h>

    #include <string.h>

    void func(char str[50])

    {

            printf("%d, %d ", sizeof(str), strlen(str));

    }

    int main()

    {

            char s[50] = "abcdefght";

            func(s);

    }

    [root@localhost test]# gcc 12_13_4.c

    [root@localhost test]# ./a.out

    4, 9

    [root@localhost test]#

       void func(char str[50])这里的50没有任何意义。sizeof(str)这里str代表数组首元素的地址。

    10.

    [root@localhost test]# cat 12_13_5.c

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h>

    int main()

    {

            char stra[] = "HelloWorld";

            char *strb = stra;

            printf("%d, %d ", sizeof(stra), sizeof(strb++)); //stra代表整个数组,11是因为要算上''

            printf("%d, %d ", strlen(strb), strlen(strb++)); //参数从右到左计算

        //sizeof()是个关键字,在预编译时已经计算出了大小,不做运算

    }

    [root@localhost test]# gcc 12_13_5.c

    [root@localhost test]# ./a.out

    11, 4

    9, 10

    [root@localhost test]#

    11.

      函数指针:

    例如,

    int func(int x);   /* 声明一个函数 */

    int (*f) (int x);    /* 声明一个函数指针 */

    f=func;            /* 将func函数的首地址赋给指针f */

    赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

      指针函数:

           类型标识符    *函数名(参数表)

    例如,

    int *f(x,y);

     

    12.kill -l :列出所有信号

    13.注意将while(1)和sleep()(睡眠)区别开来。

    14.信号处理程序不可重入函数:

      a.函数返回值是指针,传递给函数的参数有指针。

      b.内部有malloc()或free()调用的函数。

      c.使用了全局数据结构的函数。

      d.实现时用了标准I/O函数。

       

    15.alarm定时产生的误差是比较大的。settimer可以用来精确定时。

  • 相关阅读:
    Difference between 2>&-, 2>/dev/null, |&, &>/dev/null and >/dev/null 2>&1
    (OK)(OK) docker-(centos-quagga-ospf-mdr)--NS3--MANET
    How to Interactively Create a Docker Container
    (OK)(www.nrl.navy.mil) OSPF MANET Designated Routers (OSPF-MDR) Implementation
    docker-batman
    (OK)(OK) NS3
    quagga-mtr——Multi-Topology Routing support for quagga routing suite
    (OK)(OK) seem-tools-CLI-manual.sh
    (OK)(OK) seem-tools-CLI-semi-auto.sh
    (OK)(OK) manet-seem-template.cc
  • 原文地址:https://www.cnblogs.com/huanchao/p/3473794.html
Copyright © 2020-2023  润新知