C字符串和指针问题汇总
空指针和传参问题
1) 段错误。形参改为二级指针即可
void GetMemory( char *p ){
p = (char *) malloc( );
} 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 );
} )free只是把指针指向的内容释放,指针本身还可以使用(但是内容失效),所以需要置为NULL。类似的,未初始化的指针不能假定其值本身为0或NULL,也可能是任意值甚至可以对其解引用! void Test(void){
char *str = (char *) malloc();
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)-] = ‘/’; snprintf的正确用法: snprintf(dest, sizeof(dest), "%s", src); strncpy的问题: size一定要用sizeof(dest)或sizeof(dest)-,不可误用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字符串和指针问题汇总的更多相关文章
- c#编程指南(十) 平台调用P-INVOKE完全掌握, 字符串和指针
可以说新手使用P-INVOKE最开始的头疼就是C#和C++的字符串传递,因为这里涉及到两个问题. 第一:C#的string和C++的字符串首指针如何对应. 第二:字符串还有ANSI和UNICODE(宽 ...
- Lotus中关于字符串处理的函数汇总
我们在使用LotusScript编写代理程序的时候,很多时候我们会遇到需要处理字符串的情况,本文就对平时遇到的相关函数做一个汇总. Sub Initialize Dim testStr As Str ...
- 指向字符串的指针在printf与cout区别
根据指针用法: * 定义一个指针, &取变量地址, int b = 1; int *a = &b; 则*a =1,但对于字符串而言并非如此,直接打印指向字符串的指针打印的是地址还是字符 ...
- C++常用字符串分割方法实例汇总
投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-10-08我要评论 这篇文章主要介绍了C++常用字符串分割方法实例汇总,包括了strtok函数.STL.Boost等常用 ...
- (转自aierong原创技术随笔)sqlserver字符串拆分(split)方法汇总
sqlserver字符串拆分(split)方法汇总 --方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5, ...
- C语言复习-字符串与指针
C语言复习-字符串与指针 例一: [字符串处理 去除C代码中的注释] C/C++代码中有两种注释,/* */和//.编译器编译预处理时会先移除注释.就是把/*和*/之间的部分去掉,把//以及之后的部分 ...
- C语言之数组,字符串,指针
一. 数组的定义 1. 数组初始化 初始化方式 int a[3] = {10, 9, 6}; int a[3] = {10,9}; int a[] = {11, 7, 6}; int a[4] = ...
- Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法
由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与Unsafe ...
- 「C」 数组、字符串、指针
一.数组 (一)数组 概念:用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. (二)数组的定义 格式: 类型 数组名[元素个数 ...
随机推荐
- c++模板
1.从 python 说起 def add(a, b): return a + b; print add(3.1, 5.1); #8.2 print add("abc", &quo ...
- css3动画由浅入深总结
阅读目录 一:过渡动画---Transitions 二:Animations功能 三:translate(tx,ty) 四:scale(x,y) 五:rotate(x): 5.1:skew(x,y): ...
- [AngularJS] jQuery时代
抹平浏览器差异的jQuery出现了 jQuery有什么 jQuery使得开发无刷新动态页面(AJAX)或者单页应用(SAP)变得 相当简单. 标准的HTML页面是静态的,被浏览器渲染后就产生了一个DO ...
- POJ 1061 青蛙的约会
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 82859 A ...
- 机器学习之Hash集合问题
问题来源与七月学习之 (3.x线性代数与矩阵运算基础)
- mytbatis小问题
使用mybatis出现以下异常 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, Postgr ...
- C/C++多种方法获取文件大小(转)
源码下载:点击下载 源码如下: #include <iostream> #include <io.h> #include <sys\stat.h> #include ...
- 第一款支持容器和云部署的开源数据库Neo4j 3.0
导读 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计:提供给开发者更强大的生产力:提供更广阔的部署选择.Neo4j 3.0 被认为是世界 ...
- 理解js中this的指向
学习自原文 http://www.cnblogs.com/pssp/p/5216085.html后的一点小结(原文作者总结的很棒^_^)! 关于js中this的指向,在函数定义的时候还无法 ...
- leetcode 解题报告 Word Break
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...