空指针和传参问题
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。
时间: 2024-10-27 03:19:46