空指针和传参问题

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字符串和指针问题汇总的更多相关文章

  1. c#编程指南(十) 平台调用P-INVOKE完全掌握, 字符串和指针

    可以说新手使用P-INVOKE最开始的头疼就是C#和C++的字符串传递,因为这里涉及到两个问题. 第一:C#的string和C++的字符串首指针如何对应. 第二:字符串还有ANSI和UNICODE(宽 ...

  2. Lotus中关于字符串处理的函数汇总

    我们在使用LotusScript编写代理程序的时候,很多时候我们会遇到需要处理字符串的情况,本文就对平时遇到的相关函数做一个汇总. Sub Initialize  Dim testStr As Str ...

  3. 指向字符串的指针在printf与cout区别

    根据指针用法: * 定义一个指针, &取变量地址, int b = 1; int *a = &b; 则*a =1,但对于字符串而言并非如此,直接打印指向字符串的指针打印的是地址还是字符 ...

  4. C++常用字符串分割方法实例汇总

    投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-10-08我要评论 这篇文章主要介绍了C++常用字符串分割方法实例汇总,包括了strtok函数.STL.Boost等常用 ...

  5. (转自aierong原创技术随笔)sqlserver字符串拆分(split)方法汇总

    sqlserver字符串拆分(split)方法汇总   --方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5, ...

  6. C语言复习-字符串与指针

    C语言复习-字符串与指针 例一: [字符串处理 去除C代码中的注释] C/C++代码中有两种注释,/* */和//.编译器编译预处理时会先移除注释.就是把/*和*/之间的部分去掉,把//以及之后的部分 ...

  7. C语言之数组,字符串,指针

    一. 数组的定义 1.  数组初始化 初始化方式 int a[3] = {10, 9, 6}; int a[3] = {10,9}; int a[] = {11, 7, 6}; int a[4] = ...

  8. Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法

    由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与Unsafe ...

  9. 「C」 数组、字符串、指针

    一.数组 (一)数组 概念:用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. (二)数组的定义 格式: 类型 数组名[元素个数 ...

随机推荐

  1. 完全迁移到red hat来的相关问题解决和配置

    默认从光盘iso镜像安装iso-1 时, yum.repos.d只有 packagekit-media.repo, 要从网上下载一个 CentOS-Base.repo文件放到这里. redhat上下载 ...

  2. Android布局属性大全

    RelativeLayout http://wenku.baidu.com/view/2e39724333687e21af45a97e.html?from=related&hasrec=1 h ...

  3. mysql 总结二(自定义函数)

    本质:mysql内置函数的一种扩展,本质上与mysql内置函数一样. 函数必要条件: @1:参数(非必备): @2:返回值: 模板: create function function_name ret ...

  4. AlwaysOn可用性组测试环境安装与配置(一)--SQL群集环境搭建

    一.测试环境介绍 1. 宿主使用工作站(HYPR-V)基本配置如下: 处理器:Intel(R) Core(TM) i5-4470 CPU @ 3.20GHz 3.20GHz 内存(RAM):8.00G ...

  5. VS上利用C#实现一个简单的串口程序记录

    一.背景 工作上需要利用串口往下位机写入数据,VC太老,正好借此机会来熟悉一直很想接触的VS之C#. 感谢Tony托尼哥的串口通信代码,感谢梦真的C#的技术支持. 二.正文 1.项目架构:(以我现有的 ...

  6. cocos2d-x多分辨率适配方案:setDesignResolutionSize使用

    1. setDesignResolutionSize使用方法及主要的三种适配模式 在cocos2d-x 2.0里,提供了一个叫做setDesignResolutionSize的方法,直接一次设置就可以 ...

  7. Swift3.0P1 语法指南——集合类型

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  8. setValuesForKeysWithDictionary forUndefinedKey

    http://my.oschina.net/u/2407613/blog/524879 -(void)setValue:(id)value forUndefinedKey:(NSString *)ke ...

  9. MyEclipse 2013优化配置【转】

    作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs MyEclipse 2013优化速度方案仍然主要有这么几个方面:去除无需加载的模块.取消冗余的配置.去除不 ...

  10. ASP.NET实现验证码

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...