zoukankan      html  css  js  c++  java
  • C字符串和指针问题汇总

    空指针和传参问题

    1) 段错误。形参改为二级指针即可
    void GetMemory( char *p ){
      p = (char *) malloc( 100 );
    }
    
    void Test( void ){
    char *str = NULL;
    GetMemory( str );
    strcpy( str, "hello world" );
    printf("%s
    ",str);
    }
    
    2) char p[]改为char*即可,否则是局部变量
    char *GetMemory( void ){ 
     char p[] = "hello world"; 
     return p; 
    }
    
    void Test( void ){ 
     char *str = NULL; 
     str = GetMemory(); 
     printf( str ); 
    }
    
    3)free只是把指针指向的内容释放,指针本身还可以使用(但是内容失效),所以需要置为NULL。类似的,未初始化的指针不能假定其值本身为0或NULL,也可能是任意值甚至可以对其解引用!
    
    void Test(void){
    char *str = (char *) malloc(100);
    strcpy(str,"hello");
    printf("%p
    ",str);
    free(str);
    printf("%p
    ",str); 
    if(str != NULL){ 
    strcpy(str,"world"); 
    printf(str);
    } 
    }

    snprintf和strncpy应用范式

    strncpy的正确用法:
    
    strncpy(dest, src, sizeof(dest));
    dest[sizeof(dest)-1] = ‘/0’;
    
    snprintf的正确用法:
    
    snprintf(dest, sizeof(dest), "%s", src);
    
    strncpy的问题:
    
    size一定要用sizeof(dest)或sizeof(dest)-1,不可误用sizeof(src).
    手工填0. 务必要把dest的最后一个字节手工设置为0. 因为strncpy仅在src的长度小于dest时,对剩余的字节填0.
    性能问题。当dest长度远大于src时,由于strncpy会对多余的每个字节填0,会有很大的性能损失。
    返回值。strncpy返回dest,因而无法知道拷贝了多少个字节。
    snprintf的问题:
    
    不可省略第三个参数"%s",隐患是,如果src中包含%,会引发core。
    性能问题。当src长度远大于dest时,由于snprintf要返回src的字节数,需要扫描src,会有很大的性能损失。
    返回值。如果当前buf够用,返回实际写入的字符数;如果不够用,返回将要写入的字符数。换句话说,返回值就是传入的字符数目。
    总结:
    
    snprintf使用比strncpy简洁。
    snprintf可以获取被拷贝的字节数。
    二者都有性能问题。如果src远大于dest,用strncpy;如果dest远大于src,用snprintf。
  • 相关阅读:
    HDOJ-3635-Dragon Balls 解题报告
    HDOJ-1217-Arbitrage 解题报告
    C语言控制台窗口图形界面编程(总结)
    PC(win10)上搭建 kubernetes + docker 集群环境
    Hessian 2.0 序列化协议
    对响应式布局的理解
    常用链接集合
    dubbox升级dubbo的过渡方案:通过扩展dubbo的Protocol实现dubbo与dubbox的相互调用
    Wordpress部署 —— 基于Ubuntu、Mysql和Nginx
    关于27种常见设计模式的总结
  • 原文地址:https://www.cnblogs.com/zhaoyl/p/3837459.html
Copyright © 2011-2022 走看看