zoukankan      html  css  js  c++  java
  • 《C陷阱与缺陷》笔记

    1、如果f是一个函数,则

    f();

    指调用该函数,

    f;

    却什么也不做,准确的说,这个语句计算函数f的地址,但并不调用该函数。

    2、C语言允许初始化列表出现多余的逗号,是为了对称。

    如:

    int days[] = {1, 2, 3, 4, 5, 6, 7,};

    最后有逗号是正确的。

    3、malloc要注意是否申请成功,和最后的free。

    4、strcpy的目标要申请好了内存。

    5、溢出的结果是未定义的。

    6、strcpy只用于字符串复制,memcpy用于一般内存的复制。

    strcpy根据\0判断结束否,memcpy根据第三个参数的长度判断结束。

    实现如下:

    char * strcpy(char * dest, const char * src) // 实现src到dest的复制 
    { 
      if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性   
          return NULL; 
      char *strdest = dest;        //保存目标字符串的首地址 
      while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下 
      return strdest; 
    } 
    
    void *memcpy(void *memTo, const void *memFrom, size_t size) 
    { 
      if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效 
             return NULL; 
      char *tempFrom = (char *)memFrom;             //保存memFrom首地址 
      char *tempTo = (char *)memTo;                  //保存memTo首地址       
      while(size -- > 0)                //循环size次,复制memFrom的值到memTo中 
             *tempTo++ = *tempFrom++ ;   
      return memTo; 
    } 

    7、#define T1 struct foo *

    typedef struct foo *T2;

    T1 a, b;

    T2 a, b;

    8、标识符名称的限制,ANSI C规定,C实现必须能够区别出前6个字符不同的外部名称。

    9、a+++++b

    根据贪心法,上面表达式是错误的,因为会被解析为 a++ ++ +b即((a++)++)+b,而a++不能作为左值。

  • 相关阅读:
    python活力练习Day 31
    携程笔试题3--2020-09-08
    双指针应用
    华为笔试题之排序去重
    java架构师学习路线-Mybatis一级缓存源码分析
    java架构师学习之spring boot对比spring mvc有什么区别
    spring Cloud 开发内存占用过高时java架构师该如何解决
    java高级架构师教程-使用Maven配置Spring
    java高级架构师教程-Spring Boot快速入门
    java高级架构师教程-使用Java编程引导JPA
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2965009.html
Copyright © 2011-2022 走看看