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。
  • 相关阅读:
    5月27 开通博客啦
    源码编译安装mysql-boost-5.7.16.tar.gz报错分析处理
    MHA实践操作
    (转)MySQL高可用方案MHA的部署和原理
    Mysql利用binlog日志恢复数据操作(转)
    生产环境mysql数据库主从恢复从数据库 -- flush tables with read lock;
    带着问题学习openstack
    openstack的网络模式(转)
    openstack 镜像初始化root登录密码
    openstack placement 组件作用理解
  • 原文地址:https://www.cnblogs.com/zhaoyl/p/3837459.html
Copyright © 2011-2022 走看看