码迷,mamicode.com
首页 > 其他好文 > 详细

C字符串和指针问题汇总

时间:2014-07-14 10:03:36      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   使用   strong   

空指针和传参问题

1) 段错误。形参改为二级指针即可
void GetMemory( char *p ){
  p = (char *) malloc( 100 );
}

void Test( void ){
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf("%s\n",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\n",str);
free(str);
printf("%p\n",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。

 

C字符串和指针问题汇总,布布扣,bubuko.com

C字符串和指针问题汇总

标签:des   style   blog   color   使用   strong   

原文地址:http://www.cnblogs.com/zhaoyl/p/3837459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!